将来自不同表的行连接到一个字段中

时间:2009-06-10 08:57:29

标签: sql-server xml concatenation

在使用MSSQL 2005数据库的项目中,我们需要在日志记录表中记录所有数据操作操作。该表中的一个字段应该在更改之前包含该行。我们有很多表,所以我试图编写一个存储过程,它将收集给它的一行表中的所有字段,以某种方式连接它们,然后用这些信息写一个新的日志条目。

我已经尝试使用FOR XML PATH并且它有效,但客户端不喜欢XML表示法,他们想要一个csv字段。

以下是我对FOR XML PATH的看法:

DECLARE @foo varchar(max);
SET @foo = (SELECT * FROM table WHERE id = 5775 FOR XML PATH(''));

“table”,“id”和实际id(此处为:5775)的值稍后将通过调用传递给存储过程。

有没有办法在没有获得XML表示法且不事先知道SELECT语句将返回哪些字段的情况下执行此操作?

2 个答案:

答案 0 :(得分:0)

我们使用XML路径,正如您所发现的,它运行良好。由于SQL的一个特性是正确存储XML,因此CSV毫无意义。

你可以尝试的是一个以CSV格式读出XML的存储过程(伪造它)。我会。由于与保存数据相比,您不太可能读取数据,因此开销可以忽略不计。

答案 1 :(得分:0)

怎么样:

Set @Foo = Stuff(
                        ( Select ',' + MyCol1 + ',' + MyCol2 ...
                            From Table
                            Where Id = 5775 
                            For Xml Path('') 
                        ), 1, 1, '')

这将生成CSV行(假设内部SQL返回单行)。现在,这解决了问题的第二部分。至于“事先不知道哪个字段”的第一部分,没有使用动态SQL就没有办法做到这一点。即,您必须动态地将SQL语句构建为字符串。如果您打算这样做,您也可以动态构建整个CSV结果。