我想创建一个动态查询,以在一个表中列出所有唯一用户,我只需要该用户名,来自所有具有相同数据库架构的不同数据库。 由于表的名称在不同的环境中会有所不同,因此我希望动态一些,以便可以在不同的环境中执行。 基本查询如下:
SELECT USERNAME FROM DATABASE.DBO.USERTABLE WHERE LOGIN = 'Y'
要在3个数据库上执行此查询,它看起来像这样:
SELECT *
FROM ( SELECT UT.USERNAME AS 'DB1'
FROM DB1.DBO.USERTABLE UT
WHERE UT.LOGIN = 'Y'
) a
full outer join
( SELECT UT.USERNAME AS 'DB2'
FROM DOSSIER.DBO.USERTABLE UT
WHERE UT.LOGIN = 'Y'
) b ON a.DB1 = b.DB2
full outer join
( SELECT UT.USERNAME AS 'DB3'
FROM DB3.DBO.USERTABLE UT
WHERE UT.LOGIN = 'Y'
) c ON a.DB1 = c.DB3
ORDER BY A.DB1
是否有一种简单的方法可以为此创建动态查询,并将其应用于多个数据库?
我已经尝试过下面的代码,但是我发现很难使JOIN ON正常工作。
DECLARE @Sql NVARCHAR(MAX) = NULL;
SELECT @Sql = COALESCE(@Sql + ' AS '+ name + ' FULL OUTER JOIN ON' + CHAR(13) + CHAR(10), '' ) + 'SELECT USERNAME AS ' + name + ' FROM [' + name + '].[DBO].[USERTABLE] AS '+ name
FROM master.sys.databases
WHERE NOT [name] IN ( 'master', 'tempdb', 'model', 'msdb')
PRINT @Sql;
所以我想创建的是下面的东西。
选择用户名 来自[DATA]。[DBO]。[USERTABLE]
结果
USER1
USER2
USER3
选择用户名 来自[OTHER]。[DBO]。[USERTABLE]
结果
USER3
USER4
USER6
选择用户名 来自[NEW]。[DBO]。[USERTABLE]
结果
USER1
USER6
USER7
选择用户名 来自[SOME]。[DBO]。[USERTABLE]
结果
USER2
USER5
USER7
因此,查询结果应显示在下面的列表中。
DATA ____ OTHER ___ NEW _____ SOME ____
USER1 ___________ USER1 ___________
USER2 _____________________ USER2 ___
USER3 ___ USER3 ___________________
________ USER4 ___________________
________________________ USER5 ___
________ USER6 ___ USER6 ___________
________________ USER7 ___ USER7 ___
如前所述,它是动态的,例如: 1.我不知道一个环境中有多少个数据库; 2.任何人都必须易于使用;