SQL脚本动态合并多个DB的多个和不同命名的字段

时间:2011-07-18 18:58:46

标签: sql-server tsql reporting-services

我正在尝试编写可以针对多个数据库运行的单个SQL Server脚本(对于Reporting Services)(Reporting Services将确定要运行的数据库)。问题是我在数据库中有一个表可能因数据库而异,并且会更改列的数量和名称。以下是可以从DB更改为DB的表的示例。

数据库1:

  • IDField
  • FIELDA
  • FieldB

数据库2:

  • IDField
  • FieldX
  • FieldY
  • FieldX

我现在想要编写一个脚本,该脚本返回任意字段的值并将它们合并为一个文本值(因此只需要将Reporting Services设计为具有这些字段的单个列)。这就是我想要输出的样子:

在数据库1上运行时

“IDFieldValue”| “FieldA:value,FieldB:value”

在数据库2上运行时

“IDFieldValue”| “FieldX:value,FieldY:value,FieldZ:value”

我知道我可以使用游标执行此操作,但这非常耗费资源和时间。我希望用直接的SQL做到这一点。有关如何的任何想法?

2 个答案:

答案 0 :(得分:2)

这将非常接近你正在寻找的东西。它使用动态sql。

我只花了足够的时间来提供这个概念,但我认为一旦你仔细研究,你就会看到你可以修改的地方,以便像你想要的那样进行格式化。

提示:将YOURTABLENAME替换为您正在运行的表的实际名称。

declare @pQuery varchar(max)
declare @pFields varchar(max)

SELECT @pFields = COALESCE(@pFields + '''' + '  ' +column_name + ': ''+ ', '') + 'Cast(' + column_name + ' AS VarChar(max)) + ' 
FROM information_schema.columns WHERE table_name = 'YOURTABLENAME';

SELECT @pQuery = 'SELECT ' + @pFields + '''' + '''' + ' AS [ReportRow] FROM YOURTABLENAME';

SELECT @pQuery  /** just to see what you've created */

exec(@pQuery);  /** execute dynamic sql and get back concatenated rows */

此脚本在单个表上运行,但是一旦看到该方法,修改脚本以针对许多表构建动态sql语句就不会有太多工作。

答案 1 :(得分:0)

回应评论中的问题:

不要修改第一个select子句。修改第一个select语句的where子句和第二个select语句(分配给@pQuery)

SELECT @pFields = COALESCE(@pFields + '''' + '  ' +column_name + ': ''+ ', '') + 'Cast(' + column_name + ' AS VarChar(max)) + ' 
FROM information_schema.columns WHERE table_name = 'YOURTABLENAME'
AND column_name <> 'IDField' ;

SELECT @pQuery = 'SELECT IDField,  ' + @pFields + '''' + '''' + ' AS [ReportRow] FROM YOURTABLENAME';

希望您的ID列全部命名相同。如果没有,您将必须从info_schema中选择table_name ='yourtablename'和ordinal_position = 1到变量中,并使用它代替上面的字符串文字。在这种情况下,希望您的ID字段是表格中的第一个字段:)