【发布时间】:2011-11-27 19:31:52
【问题描述】:
我有一个表值函数,基本上是一个拆分类型的函数,每个数据字符串最多返回 4 行。
所以我跑了:
select * from dbo.split('a','1,a15,b20,c40;2,a25,d30;3,e50')
我明白了:
Seq Data
1 15
2 25
但是,我的最终数据需要看起来像
15 25
所以我做了一个支点。
select [1],[2],[3],[4]
from dbo.split('a','1,a15,b20,c40;2,a25,d30;3,e50')
pivot (max(data) for seq in ([1],[2],[3],[4]))
as pivottable
按预期工作:
1 2
--- ---
15 25
但是,这对一排来说很棒。我现在需要同时处理数百条记录。我的想法是做一个 CROSS APPLY,但不知道如何结合一个 CROSS APPLY 和一个 PIVOT。
(是的,显然简单的答案是编写一个返回 4 列的修改版本,但由于其他原因,这不是一个很好的选择)
非常感谢任何帮助。
我这样做的原因是:当前查询用作 SPLIT 的标量值版本,在同一 SELECT 中针对相同的百万行(其中数据字符串为 500+ 字节)调用 12 次。
据我所知,这需要它扫描相同的 500 字节 * 1000000 行,12 次。
【问题讨论】:
-
我这样做的原因是:由于 dbo.SPLIT 中的逻辑量很大(上面是一个非常简单的方法),我试图避免运行标量值函数版本SPLIT,看起来像
select dbo.split('a',1,'1,a15,b20,c40;2,a25,d30;3,e50'),最后被调用了 12 次 ("'a',1", "'a',2","'a',3","'a',4"," 'c',1","'c'2",...),.当针对具有一百万行的表进行查询时,这肯定是一件坏事。 -
我想我不明白什么...无论如何你都需要用新参数调用函数,所以 CROSS APPLY 对你没有帮助。首先如何将参数传递给函数?你能概括一下所涉及的过程吗?
-
我不想使用参数,而是想从表中提供一个字段。当前进程基本上看起来像
select a,b,dbo.splitscalar('a',1,stringofdata), dbo.splitscalar('a', 2, stringofdata), dbo.splitscalar('b',1,stringofdata)...(总共12次),并且由于字符串是几百字节,我认为更改为CROSS APPLY并调用该函数3次可能会更快。 -
虽然这不能直接回答您的问题,但我使用this SO post 为数据透视表动态创建列。也许会有所帮助。
标签: tsql sql-server-2008 pivot user-defined-functions