代码之家  ›  专栏  ›  技术社区  ›  KenD Abbas Hadavandi

来自多个表的SQL联接

  •  3
  • KenD Abbas Hadavandi  · 技术社区  · 14 年前

    我们有一个系统(基于MS SQL 2008 R2),它有许多“输入”数据库和一个“输出”数据库。我想写一个将从输出数据库中读取的查询,以及 JOIN 它将数据存储在一个源数据库中。但是,源表可以是一个或多个单独的表:(源数据库的名称包含在输出数据库中;理想情况下,我希望执行以下操作(伪SQL ahoy)

    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 回复  |  直到 8 年前
        1
  •  1
  •   Bill Karwin    14 年前

    不,在准备查询时必须知道表。否则,查询优化器将如何知道它可以使用哪些索引?或者如果您引用的表甚至有一个uid列?

    你必须分阶段进行:

    1. 拿来 sourcedb 一个查询中输出数据库的值。

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

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

    3. 执行使用生成的新SQL字符串 exec() 正如@user353852所建议的。

        2
  •  2
  •   krock    14 年前

    尝试使用exec函数,然后将select指定为字符串,在适当的情况下为数据库名称和表添加变量。简单例子:

    DECLARE @dbName VARCHAR(255), @tableName VARCHAR(255), @colName VARCHAR(255)
    ...
    EXEC('SELECT * FROM ' + @dbName + '.dbo.' + @tableName + ' WHERE ' + @colName + ' = 1')