Così sto cercando di rendere le procedure in database diversi. Non dovrei conoscere il nome dei database. Ho cercato di creare dei cursori di nesting, il primo per ottenere i nomi dei database in modo dinamico e l'altro per creare/modificare le procedure; Ho usato EXISTS per creare procedure e NON ESISTE per alterarle. Ma in qualche modo il database rimane in "master" e non si sovrappone mai agli altri. So che c'è un problema con il mio cursore nesting interno, anche se non ho idea di cosa sia. Ecco il mio codice:Come creare procedure In diversi database con il cursore
DECLARE GetDatabases CURSOR
FOR
SELECT name
FROM sys.databases
OPEN GetDatabases
DECLARE @DBName NVARCHAR(100)
DECLARE @cmd NVARCHAR(Max)
FETCH NEXT
FROM GetDatabases
INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
set @cmd='use ' + @DBName
print @cmd
exec sp_executesql @cmd
FETCH NEXT
FROM GetDatabases
INTO @DBName
DECLARE AutoProc CURSOR
FOR
SELECT TABLE_SCHEMA,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
OPEN AutoProc
DECLARE @TableName NVARCHAR(100)
DECLARE @TableSchema NVARCHAR(100)
FETCH NEXT
FROM AutoProc
INTO @TableSchema,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS(SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('@TableName'))
exec('ALTER PROCEDURE USP_SELECT_'[email protected]+' AS
BEGIN
SELECT *
FROM '[email protected]+'.'[email protected]+'
END ;')
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('@TableName'))
exec('CREATE PROCEDURE USP_SELECT_'[email protected]+' AS
BEGIN
SELECT *
FROM '[email protected]+'.'[email protected]+'
END ;')
FETCH NEXT
FROM AutoProc
INTO @TableSchema,@TableName
END
CLOSE AutoProc
DEALLOCATE AutoProc
END
CLOSE GetDatabases
DEALLOCATE GetDatabases
PS: io non dovrei conoscere il nome del database perché sto cercando di scrivere una procedure di "Generali" in modo che possa applicarsi a tutti i database sql i-server degli utenti non solo mio
P.S2: Ho usato Nesting cursori, ma a causa della loro prestazione disastrosa, apprezzerei altri modi!
Cheers!
La linea si deve exec cmd sp_executesql non terrà per il resto della sessione rispetto a quella serie di cmd. Questo è il motivo per cui sei ancora un master, il "USE dbname" viene inviato e poi dimenticato. –
E sembra un po 'strano che non ti sia permesso conoscere i nomi dei database. Se si ha accesso a maestro, e può eseguire quel pezzo di codice, che è una specie di implicita .... :) –
@NickPfitzner ho provato 'uso + DBName', ma non ha funzionato, quindi sono passato ad usare quello. Che cosa suggerisci? –