Sql server 对所有数据库执行查询

Sql server 对所有数据库执行查询,sql-server,Sql Server,我想对所有数据库执行以下查询 DECLARE @DB_NAME VARCHAR(30) SET @DB_NAME = 'Employee'; WITH D AS ( SELECT @DB_NAME AS DB_NAME, T.NAME AS TABLE_NAME, C.NAME AS COLUMN_NAME FROM SYS.tables T INNER JOIN SYS.columns C ON T.object_id = C.object_id WHERE C.name LIKE '%A

我想对所有数据库执行以下查询

DECLARE @DB_NAME VARCHAR(30)
SET @DB_NAME = 'Employee';

WITH D
AS
(
SELECT @DB_NAME AS DB_NAME, T.NAME AS TABLE_NAME, C.NAME AS COLUMN_NAME
FROM SYS.tables T
INNER JOIN SYS.columns C 
ON T.object_id = C.object_id
WHERE C.name LIKE '%AFFINITY%'
or c.name = 'affinity'
)
SELECT DB_NAME, TABLE_NAME, MAX(COLUMN_NAME) AS COLUMN_NAME FROM D
GROUP BY DB_NAME, TABLE_NAME
ORDER BY TABLE_NAME`

这是一个无证文件

EXEC sp_MSforeachdb @command
(命令中的A
将替换为DB名称。)

否则,您需要
sp_executesql
和一个位于
sys.databases
上的光标

后者受支持,
spmsforeachdb
不受支持,因此对于任何类型的生产系统,光标都是更好的选择(即使最初需要多做一点工作)。当然,您自己对
sys.databases
的查询可以过滤数据库列表。

请小心使用:

我假设在每个必需的数据库中都有一个
MYTABLE
,否则这就行不通了

DECLARE @MYDATABASES NVARCHAR(50)

CREATE TABLE #MYBASE(DB NVARCHAR(50))

DECLARE dbcur CURSOR FOR
SELECT name
FROM sys.databases s 
WHERE name not in ('master', 'tempdb', 'msdb') --use this to select all databases but system
--WHERE NAME IN ('myfirstDB', 'mysecondDB', 'mythirdDB') --use this to select only certain databases
OPEN dbcur 
FETCH dbcur INTO @MYDATABASES
WHILE @@FETCH_STATUS = 0
BEGIN
/* MY STATEMENT */

DECLARE @SQLSTATEMENT NVARCHAR(MAX)

SELECT @SQLSTATEMENT = N'
SELECT  @DB --EDIT WITH YOUR COLUMNS
FROM '+@MYDATABASES+'.dbo.MYTABLE --EDIT THIS
'
INSERT INTO #MYBASE
EXEC sp_executesql @SQLSTATEMENT, N'@DB NVARCHAR(50)', @DB = @MYDATABASES

/* END STATEMENT */
FETCH NEXT FROM dbcur INTO @MYDATABASES
END
CLOSE dbcur
DEALLOCATE dbcur
SELECT DISTINCT * FROM #MYBASE
ORDER BY DB
DROP TABLE #MYBASE

您遇到了什么问题?如果您将
选择@DB\u NAME作为DB\u NAME
替换为
选择SCHEMA\u NAME(t.SCHEMA\u id)作为DB\u NAME
,然后完全删除该变量,会怎么样?