Need to run select statement across all databases
-
31-12-2020 - |
Question
I am trying to run a query like the one below across multiple databases
select ParamValue from Table1 where paramname = 'SYSTEM_LICENSE'
Each DB is named something like the one below and some DB should be excluded.
"Customer_123"
I looked at using sp_MSforeachdb but it isn't supported and it wasn't working well. I tried figuring out how to write a cursor but was unsuccessful. At this point just looking for some help from someone who can actually write what I am looking to do.
Solution
Here's the "do something on each db" template I use, slightly adapted to your example:
--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
EDIT: streamlined a bit, removed the raw @dbname variable and instead fixed it in the original query.
OTHER TIPS
Thanks again, slightly modified to only query the DB I wanted and output only results with YES.
--Create a table to hold the query results
CREATE TABLE #licenselist
(dbname sysname, system_license varchar(99));
DECLARE @dbname SYSNAME;
DECLARE @fixedname nvarchar(150);
--Include or exclude whatever databases you want
DECLARE dbCursor CURSOR FOR
SELECT name FROM master.sys.databases
WHERE DATABASEPROPERTYEX(name, 'Status') = 'ONLINE'
AND name like 'SOMETHING_%'
AND name not like '%_SOMETHINGELSE'
--AND name NOT IN ('master','msdb','model','tempdb');
OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @dbname;
WHILE @@FETCH_STATUS = 0
BEGIN
--Fix for invalid characters in DB names
SELECT @fixedname = REPLACE(QUOTENAME(@dbname),'''','''''');
EXEC ('USE ' + @fixedname + ';' +
'INSERT INTO #licenselist
SELECT DB_NAME() as dbname, ParamValue as system_license
FROM TABLE1
WHERE paramname = ''STRING_VALUE'';');
FETCH NEXT FROM dbCursor INTO @dbname;
END;
CLOSE dbCursor;
DEALLOCATE dbCursor;
SELECT *
FROM #licenselist
where system_license='YES'
ORDER by dbname desc
DROP TABLE #licenselist
Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange