1

我有一个表,其中包含一个将逗号分隔的值存储为字符串的字段。我想从另一个表的多行中的一行中向该字符串添加更多值。下面你会看到一个例子。

我认为 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

谢谢。任何意见,将不胜感激。

4

2 回答 2

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

我认为这将有助于你...

于 2013-03-01T07:18:34.990 回答
0

如果您想远离游标、循环并且至少运行 SQL 2008,则此解决方案将起作用。这实际上最终比您可以创建的任何函数或游标都更有效(在 SQL 2008+ 中)。

您想使用 2008 年(或 2005 年?)引入的一些新 XML 功能。具体来说,在您的查询中,您希望使用 XML PATH 模式构造一个 XML 字符串。一旦所有的结果都被塞进一个单一的 XML 字符串中,您就可以构造一个复杂的表达式来返回您想要的结果。来自msdn的更详细解释:

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

根据您所说的一切,听起来您可能需要修改我的查询。您可能需要做一些额外的连接,或者可能需要更改一些查询的内容。让我知道!

于 2013-03-01T07:43:59.023 回答