需要在所有数据库中运行 select 语句

Tho*_*rin 2 sql-server t-sql cursors

我正在尝试跨多个数据库运行如下查询

select ParamValue from Table1 where paramname = 'SYSTEM_LICENSE'
Run Code Online (Sandbox Code Playgroud)

每个 DB 的名称类似于下面的名称,并且应排除某些 DB。

“客户_123”

我查看了使用 sp_MSforeachdb,但它不受支持并且运行不佳。我试图弄清楚如何编写游标,但没有成功。在这一点上,只是寻求可以真正写出我想要做的事情的人的帮助。

Bra*_*adC 5

这是我使用的“在每个数据库上做某事”模板,稍微适应了您的示例:

--Create a table to hold the query results
CREATE TABLE #licenselist
    (dbid smallint, dbname sysname, system_license varchar(99));

DECLARE @fixedname nvarchar(150);

--Include or exclude whatever databases you want
DECLARE dbCursor CURSOR FOR
    SELECT REPLACE(QUOTENAME(name),'''','''''') --For db names with annoying characters
    FROM master.sys.databases
    WHERE state_desc = 'ONLINE'
    AND HAS_DBACCESS(name) = 1                  --Added at @SolomonRutzky's suggestion
    AND name NOT IN ('master','msdb','model','tempdb');

OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @fixedname;

WHILE @@FETCH_STATUS = 0   
BEGIN   
       EXEC ('USE ' + @fixedname + ';' + 
        'INSERT INTO #licenselist
         SELECT DB_ID() as dbid, DB_NAME() as dbname, ParamValue as system_license
         FROM Table1 
         WHERE paramname = ''SYSTEM_LICENSE'';');

       FETCH NEXT FROM dbCursor INTO @fixedname;
END;   

CLOSE dbCursor;
DEALLOCATE dbCursor;

SELECT * FROM #licenselist 

DROP TABLE #licenselist
Run Code Online (Sandbox Code Playgroud)

编辑:稍微简化一下,删除了原始的@dbname 变量,而是在原始查询中修复了它。