我有一个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)
我可以以某种方式为我的使用量身定做吗?
答案 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样本
几乎相同