sql server 2008动态数据库基于序数值

时间:2011-05-16 20:10:38

标签: sql-server-2008 pivot dynamic-sql

我有一个UDF,它拆分由空格分隔的字符串。当函数循环遍历每个字符串时,如果它找到一个空格并进行拆分,则序号将与分割字符串一起插入到自己的列中的结果表中。我已经调整了这个序数,但当然这些数字会根据字符串而改变。我需要查询这些序数并在我的支点中使用它们。有人能告诉我如何用动态sql完成这项工作吗?我在不同的论坛上看到了一些例子,但我认为这可能比我看到的更简单。我的进展如下。如果有人需要UDF,我也会发布它。

--The original data is pulled from column "DataString" in "MyData" table.
--After declaring the UDF split function the function is used and the results are
--inserted into a table called "ScriptResult" with this query
SELECT * 
INTO ScriptResult
FROM    
    MyData x    
    CROSS APPLY    
    dbo.Split (x.DataString, ' ') S

Where rtrim(s.StringValue) != '' 

--Then the table is pivoted on column Ordinal from table ScriptResult to summarize the data

Select *
INTO ScriptPivot
From ScriptResult
pivot (max (StringValue) for Ordinal in ([1], [2], [3], [5], [7], [8], [9], [10], [11]))
as   PivotResult 

示例输入:

R 456 ACCOUNT 56779900 23499000800973983989883 56 99750927     890-0983
Y 123M 120 M/Y JOHN DOE E 5678873940000056 000000 0003456      678-7898
U 06           000000 000567 000000000000000000M688399000      789-8388
H 120                                                          785-7848
R 456          0000000000000000000006578 786936689663   DTY578   568-7890

我正在使用旧的平面文件并将其解压缩为sql。问题是创建这些文件的批处理过程只有120个字符行,没有规范化等。我正在尝试将它们放入Sql Server。我放心,我可以通过导入向导更容易地做到这一点,但我需要一个Stor.Proceedure,因为这些平面仍在使用,这必须每天完成。 期望的结果:我拥有的数据透视表是我需要的结果,但我只需要能够将这个用于我得到的所有数据字符串,并且它们都不是均匀的,因此序数不同。 但这应该是它的样子......

1---2---3-------5--------7----------8-------------9--10-----------11   
R   456 ACCOUNT 56779900 2349900080 0973983989883 56 99750927     890-0983

以下是冒险作品DB的动态数据透视表示例...     DECLARE @PivotColumnHeaders VARCHAR(MAX)     SELECT @PivotColumnHeaders =       合并(         @PivotColumnHeaders +',['+ cast(Name as varchar)+']',         '['+ cast(名称为varchar)+']'        )     FROM Sales.SalesTerritory

DECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'
  SELECT *
  FROM (
    SELECT
      YEAR(H.OrderDate) [Year],
      T.Name,
      H.TotalDue
    FROM Sales.SalesOrderHeader H
    LEFT JOIN Sales.SalesTerritory T
      ON H.TerritoryID = T.TerritoryID
  ) AS PivotData
  PIVOT (
    SUM(TotalDue)
    FOR Name IN (
      ' + @PivotColumnHeaders + '
    )
  ) AS PivotTable
'

EXECUTE(@PivotTableSQL)

我可以以某种方式为我的使用量身定做吗?

1 个答案:

答案 0 :(得分:1)

如果您有一个名为Ordinals(或任何您想要的)的表,其中包含足以涵盖您可能达到的最大序数的数字,这可能对您有用: -

declare @ordList varchar(max);
select @ordList = stuff((select ', [' + rtrim(ordinal) + ']' as [text()] 
from ( 
    select distinct convert(varchar,ordinal) ordinal from Ordinals 
) ords for xml path('')),1,1,'')

exec ('select * from ( select ' + @ordList + ' from dataTable) tbl pivot (max(stringValue) FOR [1] in (' + @ordList + ')) PVT' ) end

这与AW样本

几乎相同