【问题标题】:Dynamically stating FROM which table name to SELECT from动态声明 FROM 要从哪个表名中选择
【发布时间】:2020-08-06 02:26:44
【问题描述】:

是否可以使用系统查询来检索 TABLE 名称,然后检索 SELECT * FROM that TABLE name。大致如下:

SELECT * FROM CAST (( SELECT TOP 1 t.Name 
                      FROM sys.tables t 
                      JOIN sys.columns c ON c.OBJECT_ID = t.OBJECT_ID 
                      WHERE c.NAME = 'SomeColumnID' )  AS sys.tables ) 

当前的问题是SELECT TOP 1 t.Name 将返回一个字符串,然后可以将其转换为有效的Tables.Name

【问题讨论】:

  • 所以您想指定列名,然后从所有具有该列名的表中选择所有记录?
  • 您正在寻找动态 SQL,这是一个 introduction,网上有很多教程,包括与您尝试做的类似的示例。
  • @DaleK 这可能是这个sn-p代码的一个用例,我把它写成TOP 1,但一切都会更好。我目前正在阅读链接,谢谢
  • @FarisKapo 提示:将对象名称组装成动态 SQL 语句时的最佳做法是使用 QuoteName() 以避免出现奇怪名称的问题,例如New Table 带有空格或保留字,例如 From。请阅读SQL Injection

标签: sql sql-server tsql select dynamic-sql


【解决方案1】:

为此,您需要动态 sql:即从查询构建查询字符串,然后使用 sp_executesql 执行它。

对于您的用例,如下所示:

declare @q nvarchar(max);

select top (1) @q = N'select * from ' + t.name 
from sys.tables t 
join sys.columns c on c.object_id = t.object_id 
where c.name = 'SomeColumnID'

-- debuug the query
select @q sql;

-- execute the query
execute sp_executesql @q;

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多