我有一个包含多个数据库的sql实例。在一个查询中,我想统计每个数据库中两个表(商店和位置(的行数,以便能够比较值。
到目前为止,我有以下查询:
SELECT ('SELECT COUNT(1) FROM [' + name + '].[abc].[Shops]') as shopCount,
('SELECT COUNT(1) FROM [' + name + '].[def].[Locations]') as locationCount,
name as DB
FROM sys.databases
WHERE OBJECT_ID('[' + name + '].[abc].[Shops]') IS NOT NULL AND
OBJECT_ID('[' + name + '].[def].[Locations]' ) IS NOT NULL
这导致以下输出
shopCount | locationsCount | DB
------------------------------------------------------------------------------------------------------------------
SELECT COUNT(1) FROM [database1].[abc].[Shops] | SELECT COUNT(1) FROM [database1].[def].[Locations] | database1
------------------------------------------------------------------------------------------------------------------
SELECT COUNT(1) FROM [database2].[abc].[Shops] | SELECT COUNT(1) FROM [database2].[def].[Locations] | database2
很明显,我并没有将字符串作为查询来执行,但却不知道如何执行
类似这样的东西:
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
CREATE TABLE #DataSource
(
[shopCount] INT
,[locationCount] INT
,[database] SYSNAME
);
SET @DynamicTSQLStatement = STUFF
(
(
SELECT ';INSERT INTO #DataSource SELECT (SELECT COUNT(1) FROM [' + name + '].[abc].[Shops]), (SELECT COUNT(1) FROM [' + name + '].[def].[Locations]), ''' + name +''''
FROM sys.databases
WHERE OBJECT_ID('[' + name + '].[abc].[Shops]') IS NOT NULL AND
OBJECT_ID('[' + name + '].[def].[Locations]' ) IS NOT NULL
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
EXEC sp_executesql @DynamicTSQLStatement;
SELECT *
FROM #DataSource;
DROP TABLE #DataSource;
您正在尝试执行一些动态sql。请阅读以下内容:http://www.sqlservertutorial.net/sql-server-stored-procedures/sql-server-dynamic-sql/
第一个例子似乎是你想要的。