来自多个表的SQL连接

时间:2010-06-05 14:27:01

标签: tsql

我们有一个系统(基于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];

有没有办法做上面这样的事情 - “动态”指定要为查询中的每一行加入的数据库和表?

2 个答案:

答案 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列?

你必须分阶段这样做:

  1. 在一个查询中从输出数据库中获取sourcedb值。

  2. 构建SQL查询字符串,将第一个查询中提取的值插入到第二个查询的FROM子句中。

    请注意检查此值是否包含合法的数据库名称。例如,过滤掉非字母字符或应用正则表达式或在白名单中查找。否则,您将面临SQL Injection风险。

  3. 执行使用exec()构建的新SQL字符串,如@ user353852所示。