我一直在尝试解决该问题的方法,但是我想我只是不具备一开始就知道要寻找什么的技能。我正在使用现有系统,因此无法更改数据库架构,也不能指示用户如何输入数据。我必须与我们所拥有的一起工作。
当前,我们的用户正在将统计数据放入表格的一个文本字段中。他们使用每行一个统计信息的标准格式,并使用文本限定符来“界定”统计信息的详细信息。IE
<Category> - D:<Description> Q:<Quanitity> V:<Value> <Category> - D:<Description> Q:<Quanitity> V:<Value>
(实际数据中没有任何<>括号…我只是用它们来显示细节在哪里。)
在上面的示例中,两个统计信息保存在一个文本字段记录中,并且表中有许多“统计”记录。
编辑:我正在使用MS SQL Server 2005,我需要为每个描述的数量/值总和创建一个报告。
我实现了一个拆分用户功能,可以在一条记录上使用该功能将每一行拆分为单独的记录…但是据我所知。
我需要“从StatsTable中选择Stats”,然后遍历每个stats记录,将其拆分成单独的行,然后从每个拆分的行中提取类别,描述,数量和值,然后将所有结果返回到一个表中。
我已经设法将一个嵌套的游标拼凑在一起了……看起来很有效。
declare o CURSOR FAST_FORWARD FOR select comments from EVENT declare @comment nvarchar(max) OPEN o FETCH NEXT FROM o into @comment while @@FETCH_STATUS = 0 BEGIN Declare @item nvarchar(750) declare @tbl Table(Category nvarchar(250), Description nvarchar(250), Quantity nvarchar(250), Value DECIMAL(10,2)) declare c CURSOR FAST_FORWARD FOR SELECT items FROM dbo.Split(@comment, Char(10)) OPEN c FETCH NEXT FROM c into @item WHILE @@FETCH_STATUS = 0 BEGIN set @item = @item + ':' insert into @tbl Values (LTRIM(RTRIM(SUBSTRING(@item, 1, CHARINDEX(' - ', @item) - 1))), CASE when @item like '%D:%' Then LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('D:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('D:', @item)+2) - CHARINDEX('D:', @item) - 3))) else '' end, CASE when @item like '%Q:%' Then LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('Q:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('Q:', @item)+2) - CHARINDEX('Q:', @item) - 3))) else '1' end, CASE when @item like '%V:%' Then CONVERT(DECIMAL(10,2),dbo.RemoveNonNumericCharacters(LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('V:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('V:', @item)+2) - CHARINDEX('V:', @item) - 3))))) else 0 end) FETCH NEXT FROM c into @item END CLOSE c DEALLOCATE c END CLOSE o DEALLOCATE o SELECT * FROM @tbl