【发布时间】:2022-03-29 02:54:53
【问题描述】:
我有这个动态查询,即从我所有的数据库(以“Db”开头)同一个表(“Tbl_SameTable”)联合起来。
DECLARE @tableName nvarchar(256) = 'Tbl_SameTable'
DECLARE @sql nvarchar(max) = ''
SELECT @sql = @sql + CASE WHEN @sql <> '' THEN 'UNION ALL ' ELSE '' END
+ 'SELECT * FROM [' + dbs.name + ']..[' + @tableName + '] '
FROM sys.sysdatabases dbs
WHERE left(dbs.name,2) = 'Db'
EXEC(@sql)
我想在这个查询中添加两件事:
- 添加一列数据库名称
- 将查询结果分配给“临时表”或“表变量”
我不知道这是否重要,但是“Tbl_SameTable”是一个 5 列的表(int、nvarchar、int、nvarchar、nvarchar)
【问题讨论】:
-
警告:
'[' + @tableName + ']'不适合注射。使用QUOTENAME正确引用您的对象。 -
什么版本的 SQL Server?请注意,不能保证聚合字符串连接 (
@sql = @sql +) 有效;在 SQL 2017+ 中使用STRING_AGG或在早期版本中使用FOR XML。 -
如果您在多个数据库中拥有相同的表,具有相同的定义,那么老实说,这表明您存在设计缺陷。如果您需要在单个数据集中处理这些数据,那么数据应该在单个数据库(和表)中。
-
Dan Guzman,我的 SQL Server 版本是 2017
标签: sql-server tsql