Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 General SQL Server Forums
 New to SQL Server Programming
 How do I scroll through all databases?

Author  Topic 

Bill_C
Constraint Violating Yak Guru

299 Posts

Posted - 2009-11-25 : 05:15:03
I want to use a cursor to scroll through all the databases on our server and interrogate tables within those databases, the following does not work:-

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

DECLARE @dbname sysname

DECLARE dbcursor CURSOR
FOR SELECT [name] FROM master..sysdatabases
WHERE [name] NOT IN ('master','tempdb','model','msdb')
OPEN dbcursor
FETCH NEXT FROM dbcursor
INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @dbname
USE @dbname

'''''''do all my interrogation here


FETCH NEXT FROM dbcursor
INTO @dbname

END
CLOSE dbcursor
DEALLOCATE dbcursor

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


Can anyone point me as to how to scroll through the databases please?

Thanks


rajdaksha
Aged Yak Warrior

595 Posts

Posted - 2009-11-25 : 05:22:21
HI

you expect this...

DECLARE @INT INT
DECLARE @DBNAME VARCHAR(50)

SET @INT = 1

CREATE TABLE #TMPDB(ID INT IDENTITY(1,1) , DBNAME VARCHAR(50))

INSERT INTO #tmpDB
SELECT [name] FROM master..sysdatabases
WHERE [name] NOT IN ('master','tempdb','model','msdb')

WHILE @INT <= ISNULL((SELECT COUNT(*) FROM #tmpDB),0)
BEGIN
SELECT @DBNAME = DBName FROM #tmpDB WHERE ID = @INT

-- do all your interrogation here


SET @INT = @INT + 1


END




-------------------------
R...
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2009-11-25 : 05:25:35
you'll probably need to use dynamic sql.

There are some undocumented procedures called forEachDatabase / forEachTable (or something like that) but, in reality they just use dynamic sql inside.

A few people here like them. I don't just because they are undocumented.

This is the quick n dirty method I'd use to cross db query.

IF OBJECT_ID('tempdb..#results') IS NOT NULL DROP TABLE #results
CREATE TABLE #results (
[serverName] VARCHAR(255)
, [dbName] VARCHAR(255)
, [payroll] VARCHAR(255)
, [payrollId] INT
, [payrollYear] VARCHAR(255)
, [payrollYearID] INT
, [periodId] INT
, [periodStart] DATETIME

CONSTRAINT PK_SERVERNAME_DBNAME_PAYROLLID_PERIODID PRIMARY KEY CLUSTERED ([serverName], [dbName], [payrollId], [periodID])
)

DECLARE @sql NVARCHAR(MAX)
DECLARE @dbName VARCHAR(255)

DECLARE dbCursor CURSOR LOCAL STATIC FOR SELECT
[name]
FROM
sys.databases
WHERE
[name] LIKE '[_]%'

OPEN dbCursor

FETCH NEXT FROM dbCursor INTO @dbName

WHILE ( @@FETCH_STATUS = 0 ) BEGIN

SET @Sql = N'
USE [' + @dbName + ']

INSERT #results (
[serverName]
, [dbName]
, [payroll]
, [payrollId]
, [payrollYear]
, [payrollYearID]
, [periodId]
, [periodStart]
)
SELECT
[serverName]
, [dbName]
, [payroll]
, [payrollID]
, [payrollYear]
, [payrollYearID]
, [periodID]
, [periodStarts]
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY py.[ID] ORDER BY pp.[startDate] DESC) AS [rowPos]
, @@SERVERNAME AS [serverName]
, DB_NAME() AS [dbName]
, p.[name] AS [payroll]
, p.[Id] AS [payrollID]
, py.[name] AS [payrollYear]
, py.[Id] AS [payrollYearID]
, pp.[ID] AS [periodID]
, pp.[startDate] AS [periodStarts]
FROM
payrollPeriod pp
JOIN payrollYear py ON py.[Id] = pp.[payrollYearID]
JOIN payroll p ON p.[ID] = py.[payrollID]
WHERE
PP.[approved] = 1
AND EXISTS (
SELECT 1
FROM
payrollPeriod pp2
WHERE
pp2.[approved] = 0
AND pp2.[payrollYearId] = pp.[payrollYearID]
AND pp2.[startDate] < pp.[startDate]
)
)
res
WHERE
res.[rowPos] = 1'

PRINT @sql
EXEC sp_executeSql @sql

FETCH NEXT FROM dbCursor INTO @DbName
END

CLOSE dbCursor
DEALLOCATE dbCursor

SELECT * FROM #results


Don't worry about the actual insert statement -- it was coded for a strange and very specific set of circumstances but you should be able to get the framework for some usable results.


Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page

Bill_C
Constraint Violating Yak Guru

299 Posts

Posted - 2009-11-25 : 05:46:21
Thanks both
Go to Top of Page
   

- Advertisement -