我有一个带有字段的表,该字段将逗号分隔的值存储为字符串。我想在另一个表中的多行中的一行中为该字符串添加更多值。您将在下面看到一个示例。
我脑子里有COALESCE()可以工作,我知道如何使用这个技巧加载变量,但我认为这意味着我必须使用游标来收集所有的值我想要t1的每一行,我真的想避免使用游标。这个表设计是我继承的一个混乱,我宁愿通过在任何地方使用游标来处理它而使其变得更糟。
CREATE Table t1(
StringColumn VARCHAR(10)
)
CREATE Table T2(
TestString VARCHAR(10),
ConcatString VARCHAR(10)
)
INSERT INTO t1(StringColumn) VALUES('1,2,3')
INSERT INTO T2(TestString,ConcatString) VALUES('2','4')
INSERT INTO T2(TestString,ConcatString) VALUES('2','5')
INSERT INTO T2(TestString,ConcatString) VALUES('2','6')
INSERT INTO t1(StringColumn) VALUES('A,B,C')
INSERT INTO T2(TestString,ConcatString) VALUES('A','D')
INSERT INTO T2(TestString,ConcatString) VALUES('B','E')
INSERT INTO T2(TestString,ConcatString) VALUES('B','F')
Begin Tran --Commit Rollback
UPDATE t1
Set t1.StringColumn = t1.StringColumn + ',' + t2.ConcatString
FROM t1
INNER JOIN t2 ON charindex(t2.TestString,t1.StringColumn) <> 0
SELECT * FROM t1
根据这个例子,结果是:
1,2,3,4
A,B,C,d
我希望这两行t1看起来像:
1,2,3,4,5,6-
A,B,C,d,E,F
感谢。任何建议将不胜感激。
答案 0 :(得分:0)
为什么不在这里使用行处理。 您可以使用值表,然后像这个示例一样使用:
DECLARE @T TABLE(Id int identity,Value int)
DECLARE @MinId INT = (SELECT MIN(Id) FROM @T)
DECLARE @MaxId INT = (SELECT MAX(Id) FROM @T)
DECLARE @ResultTable TABLE (Value int)
WHILE(@MinId <= @MaxId)
BEGIN
INSERT @ResultTable
SELECT Value
FROM @T
WHERE Id = @MinId
SET @MinId += 1
END
SELECT *
FROM @ResultTable
我认为这将有助于你...
答案 1 :(得分:0)
如果您希望远离游标,循环并且至少运行SQL 2008,此解决方案将起作用。这实际上比您可以创建的任何函数或游标更有效(在SQL 2008+中)。
您想要使用一些新的XML功能2008(或2005?)。具体来说,在查询中,您希望使用XML PATH模式构造XML字符串。一旦所有结果都被卡入单个XML String中,您就可以构造一个复杂的表达式来返回您所追求的内容。从msdn:
更详细地解释使用您提供的示例表,尝试以下查询:
SELECT
Test_String = T.StringColumn + (SELECT
(',' + t2.ConcatString)
FROM
T1 t1
INNER JOIN T2 t2
ON charindex(t2.TestString,t1.StringColumn) <> 0
WHERE
t1.StringColumn = t.StringColumn
FOR XML PATH( '' ))
FROM
T1 T
根据您所说的一切,听起来您可能需要修改我的查询。您可能需要进行一些额外的连接,或者可能会更改查询的内容。让我知道!