【发布时间】:2018-02-23 15:30:01
【问题描述】:
我知道这个标题不是最好的,但我想不出更好的。
我有一个类似于 STRING_SPLIT() 的函数,它返回一个单列表,每次拆分一行。我需要做的是在新行中保持其他列的值相同。
我有一个 #TEMP 表,其中包含许多行,如下所示:
INSERT INTO #TEMP([A], [ToSplit], [C], [D]) SELECT '549618', 'AAA, BBB', '1.7', '6'
我想将该行变成两行,一行为AAA,另一行为BBB,其他值保持相等。
我在选择列表中试过了:
SELECT *, (SELECT * FROM [dbo].[ufn_split](ToSplit,',')) FROM #TEMP
错误:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
然后作为条件(我使用 IN 因为它是唯一允许子查询的):
SELECT A, ToSplit FROM #TEMP
WHERE ToSplit IN (SELECT * FROM [dbo].[ufn_split](ToSplit,','))
没有错误,但它只返回不需要拆分的行。它只适用于 LIKE,这是不允许的。
所以我尝试在方法中放置一个子查询来创建一个单列表,每行有一个拆分值,我会逐行进行,在#TEMP 上使用 `LIKE %ToSplit%,但同样,子查询不是允许。
SELECT * FROM [dbo].[ufn_split]((SELECT ToSplit FROM #TEMP),',')
错误:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
我的问题是,如何拆分 ToSplit 中的值并保留其他列的值?
【问题讨论】:
-
使用示例行提供示例输出
-
小心使用分离器。如果它有一个 while 循环或游标,您应该考虑用基于集合的方法替换它。 sqlperformance.com/2012/07/t-sql-queries/split-strings
标签: sql-server tsql split