【问题标题】:SELECT when table names are stored in a table当表名存储在表中时选择
【发布时间】:2013-11-16 18:30:45
【问题描述】:

我有一个包含两列的表,两列中都有表名。

例如:

sourceTableName  |  destinationTableName
---------------  |  -------------------
sourceTable1     |  destinationTable1
sourceTable2     |  destinationTable2
sourceTable3     |  destinationTable3
sourceTable4     |  destinationTable4
sourceTable5     |  destinationTable5   ...

我想在两个方向上比较每对表中的每一行,以发现任何差异:

例如:

SELECT * FROM sourceTable1
EXCEPT  
SELECT * FROM destinationTable1

SELECT * FROM destinationTable1
EXCEPT  
SELECT * FROM sourceTable1

手动输入表格并不是一个真正的选择,所以我怎样才能获得FROM 位来查看我的“表名表”中的行?

【问题讨论】:

  • @YuriyGalanter。干杯,你能详细说明一下吗?
  • @BankySQL 查看 TSQL 的 EXECsp_executesql 命令。它们允许您在 VARCHAR 变量中动态构建 SQL 语句,您可以在运行时向其中添加表名,然后执行这些语句。
  • @YuriyGalanter。谢谢,这看起来很有希望。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

正如 Yuriy 在问题的 cmets 中所说,动态 SQL 是要走的路。这就是我会做的事情(过去也做过)。这应该可以帮助您入门。

DECLARE @SQL NVARCHAR(MAX)

SET @ SQL = N''

SELECT
  @SQL = @SQL + N' SELECT * FROM [' + sourceTableName + N'] EXCEPT SELECT * FROM [' + destinationTableName + N'];'
FROM
  tblOfTableNames

EXEC sp_executesql @SQL

是否存在多个架构?

【讨论】:

  • 这会导致语法错误——EXCEPT之前需要一个空格。您还应该使用分号终止查询,并在表名周围加上方括号。
  • 谢谢@AaronBertrand!我在发布答案后注意到了这一点。我已经编辑了我的答案。
【解决方案2】:
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'SELECT * FROM dbo.' + QUOTENAME(sourceTableName)
 + ' EXCEPT SELECT * FROM dbo.' + QUOTENAME(destinationTableName)
 + ';
' FROM dbo.we_have_no_idea_what_your_table_is_called;

PRINT @sql;
-- EXEC sp_executesql @sql;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2012-01-06
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多