我们有一个系统(基于MS SQL 2008 R2),它有许多“输入”数据库和一个“输出”数据库。我想编写一个将从输出DB中读取的查询,并将JOIN
写入源DB中的一个数据。但是,源表可能是一个或多个单独的表:(源DB的名称包含在输出DB中;理想情况下,我想执行以下操作(伪SQL啊)
select o.[UID]
,o.[description]
,i.[data]
from [output].dbo.[description] as o
left join (select [UID]
,[data]
from
[output.sourcedb].dbo.datatable
) as i
on i.[UID] = o.[UID];
有没有办法做上面这样的事情 - “动态”指定要为查询中的每一行加入的数据库和表?
答案 0 :(得分:2)
尝试使用exec函数,然后将select指定为字符串,在适当的位置添加数据库名称和表的变量。简单的例子:
DECLARE @dbName VARCHAR(255), @tableName VARCHAR(255), @colName VARCHAR(255)
...
EXEC('SELECT * FROM ' + @dbName + '.dbo.' + @tableName + ' WHERE ' + @colName + ' = 1')
答案 1 :(得分:1)
不,在准备查询时必须知道该表。否则,查询优化器将如何知道它可以使用哪些索引?或者,如果您引用的表甚至具有UID列?
你必须分阶段这样做:
在一个查询中从输出数据库中获取sourcedb
值。
构建SQL查询字符串,将第一个查询中提取的值插入到第二个查询的FROM子句中。
请注意检查此值是否包含合法的数据库名称。例如,过滤掉非字母字符或应用正则表达式或在白名单中查找。否则,您将面临SQL Injection风险。
执行使用exec()
构建的新SQL字符串,如@ user353852所示。