我正在尝试编写可以针对多个数据库运行的单个SQL Server脚本(对于Reporting Services)(Reporting Services将确定要运行的数据库)。问题是我在数据库中有一个表可能因数据库而异,并且会更改列的数量和名称。以下是可以从DB更改为DB的表的示例。
数据库1:
数据库2:
我现在想要编写一个脚本,该脚本返回任意字段的值并将它们合并为一个文本值(因此只需要将Reporting Services设计为具有这些字段的单个列)。这就是我想要输出的样子:
在数据库1上运行时
“IDFieldValue”| “FieldA:value,FieldB:value”
在数据库2上运行时
“IDFieldValue”| “FieldX:value,FieldY:value,FieldZ:value”
我知道我可以使用游标执行此操作,但这非常耗费资源和时间。我希望用直接的SQL做到这一点。有关如何的任何想法?
答案 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字段是表格中的第一个字段:)