在跨数据库查询中使用INFORMATION_SCHEMA

时间:2011-12-02 09:49:03

标签: sql sql-server-2008 tsql

我有6个变量:@SourceDatabase, @SourceSchema, @SourceTable, @TargetDatabase, @TargetSchema, @TargetTable

我正在编写一个应该从INFORMATION_SCHEMA.COLUMNS连接值的查询。 像这样:

SELECT a.COLUMN_NAME, b.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS a
LEFT OUTER JOIN INFORMATION_SCHEMA b
ON b.TABLE_SCHEMA = @SourceSchema
AND b.TABLE_NAME = @SourceTable
AND b.COLUMN_NAME = a.COLUMN_NAME
WHERE a.TABLE_SCHEMA = @TargetSchema
AND a.TABLE_NAME = @TargetTable

然而,在我介绍了数据库属性之后,为了比较跨数据库,我只是注意到我不认为我可以使用相同的查询而不将其作为String动态并将databasename放在INFORMATION_SCHEMA之前。像DECLARE @SQL nvarchar(254) = 'SELECT * FROM ' + @SourceDatabase + '.INFORMATION_SCHEMA ...'一样。等等

由于我真的不喜欢做动态sql,我想知道你们是否有任何聪明的解决方案来做我想做的事情而不会动态?

1 个答案:

答案 0 :(得分:0)

动态SQL当然是处理此类事情的最简单方法,但您确定这不是一个选项吗?

我能想到的唯一其他选择是在所有数据库上使用UNION ALL,并附加一个数据库名称列:

SELECT 'db1' AS dbName, *
FROM db1.sys.columns
UNION ALL
SELECT 'db2' AS dbName, *
FROM db2.sys.columns

两个数据库中的排序规则必须相同。但是动态SQL会更容易,并且可以用于任何数据库,而不仅仅是工会列表中的数据库。