【发布时间】:2020-11-03 18:06:54
【问题描述】:
我有一个包含多个数据库的 SQL Server 实例。每个数据库都有一个用户表。我正在尝试编写一个查询来计算每个数据库的用户记录数。我已经到了可以将所有database_name、schema_name 和table_name 选择到临时表中的地步。我需要能够从该查询的结果中进行选择,但我不知道该怎么做。
DECLARE @sql nvarchar(max);
SELECT @sql =
(SELECT ' UNION ALL
SELECT ' + + quotename(name,'''') + ' as database_name,
s.name COLLATE DATABASE_DEFAULT
AS schema_name,
t.name COLLATE DATABASE_DEFAULT as table_name
FROM '+ quotename(name) + '.sys.tables t
JOIN '+ quotename(name) + '.sys.schemas s
ON s.schema_id = t.schema_id'
FROM sys.databases
WHERE state = 0
ORDER BY [name] FOR XML PATH(''), type).value('.', 'nvarchar(max)');
SET @sql = stuff(@sql, 1, 12, '') + ' order by database_name,
schema_name,
table_name';
DECLARE @allTables TABLE
(
database_name NVARCHAR(MAX),
schema_name NVARCHAR(MAX),
table_name NVARCHAR(MAX)
)
INSERT INTO @allTables
EXEC (@sql)
SELECT
*
-- ,(select count(*) from [database_name].[schema_name].[table_name] where isadmin = 0) as 'Users'
-- ,(select count(*) from [database_name].[schema_name].[table_name] where isadmin = 1) as 'Admins'
FROM
@allTables
WHERE
table_name = 'C2_SEC_USERS'
这会产生以下结果集:
我已经注释掉了我需要实际计算用户数的选择部分,因为它不是有效的 SQL。是否可以根据结果集选择FROM?如果有,怎么做?
【问题讨论】:
-
仅适用于更动态的 SQL。虽然如果你有这么多数据库和同一个对象,听起来你有一个设计缺陷。
-
不同意你@Larnu。在多租户应用程序中,这种数据库结构很常见。
-
在多租户应用程序中,您不需要合并数据,@Raihan。正如 OP 正在尝试的那样,这意味着他们需要这样做,这意味着设计缺陷;他们正在使用数据库来推断应该由列定义的内容。
-
对于软件供应商来说,它可能是与所有租户中有多少用户正在使用系统相关的有用信息的一部分。
标签: sql sql-server dynamic-sql