我正在(在 .NET 中)编写一个登录屏幕,允许登录连接到 SQL Server。一旦他们输入了服务器名称和他们的凭据,它就会显示一个数据库列表供他们连接,但是,数据库需要具有正确的结构。这将在每个数据库中通过一个ref.Config
表的存在以及该表中具有适当值的行来标识。服务器上可能有一大堆其他数据库用于其他目的。我在设计时不知道。
理想情况下,我想做的是这样的:
SELECT m.name
FROM MASTER.sys.databases m
CROSS APPLY (SELECT *
FROM {m.name}.INFORMATION_SCHEMA.TABLES t
WHERE t.TABLE_SCHEMA = 'ref'
AND t.TABLE_NAME 'Config') dbs
CROSS APPLY (SELECT *
FROM {m.name}.ref.Config c
WHERE c.KeyName = 'DatabaseMagicNumber'
AND c.KeyValue = '12345678') config
WHERE HAS_DBACCESS(m.name) = 1
ORDER BY m.name
Wherem.name
被评估后被替换到子查询中(我知道上面不是有效的 SQL)。有没有办法做到这一点,还是我必须在每个数据库上运行一个查询?此时我无法在服务器上拥有存储过程。理想情况下,我只需要一条 SQL 语句,它会返回符合我期望的结构的所有数据库的名称。