在使用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语句将返回哪些字段的情况下执行此操作?
答案 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结果。