1

在使用 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 语句将返回哪些字段的情况下做到这一点?

4

2 回答 2

0

我们使用了 XML 路径,正如您所发现的,它运行良好。由于 SQL 的功能之一是正确存储 XML,因此 CSV 没有任何意义。

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

于 2009-10-22T07:50:40.320 回答
0

怎么样:

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

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

于 2010-03-14T02:07:29.160 回答