【问题标题】:Concatenating rows from different tables into one field将不同表中的行连接到一个字段中
【发布时间】:2009-06-10 08:57:28
【问题描述】:

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

【问题讨论】:

    标签: sql-server xml concatenation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      怎么样:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 2011-05-17
        • 2018-06-04
        • 2012-08-07
        • 1970-01-01
        相关资源
        最近更新 更多