动态SQL查询以列出所有主表的数据

时间:2015-08-20 10:02:05

标签: sql sql-server dynamic-sql

我的数据库中有 N 个Master表。要查看主表中的所有数据,目前我正在为每个表编写SELECT查询。所以我喜欢编写一个sql查询来列出我数据库中所有主表的数据。

由于我们对所有主表使用相同的标准,因此所有主表仅以后缀Master结尾。与RoleMasterUserMasterUserRoleMasterOfficeMasterPincodeMaster和许多人一样。

我尝试了什么:

以下查询返回所有主表的SELECT查询。

SELECT 'SELECT * FROM ' + name FROM sysobjects WHERE xtype = 'U' AND name LIKE '%Master'

返回

SELECT * FROM RoleMaster
SELECT * FROM UserMaster
SELECT * FROM UserRoleMaster
SELECT * FROM OfficeMaster
SELECT * FROM PincodeMaster
...
...

执行以下查询始终只返回一个表的数据。 PRINT语句仅返回SELECT * FROM RoleMaster

DECLARE @DynamicSql AS VARCHAR (MAX) = '';
SELECT @DynamicSql = 'SELECT * FROM ' + name FROM sysobjects WHERE xtype = 'U' AND name LIKE '%Master'  
PRINT @DynamicSql
EXEC (@DynamicSql)

问题是什么,我在这里错过了什么,为什么它没有列出所有主表的数据。

1 个答案:

答案 0 :(得分:1)

  • 您需要在开始动态查询之前添加@DynamicSql变量,例如SELECT @DynamicSql = @DynamicSql + '
  • QUOTENAME(T.name)之后,您需要添加分隔符+ '; '来分割每一行。

因此,以下查询适用于您的情况:

DECLARE @DynamicSql AS NVARCHAR (MAX) = '';

SELECT @DynamicSql = @DynamicSql + 
        'SELECT * FROM ' + QUOTENAME(S.name) + '.' + QUOTENAME(T.name) + '; ' 
FROM sys.objects T
JOIN sys.schemas S ON S.schema_id = T.schema_id
WHERE T.[type] = 'U' AND T.name LIKE '%Master' 

--PRINT @DynamicSql
EXEC (@DynamicSql)

修改:根据此comment,我更新了答案。