Итак, я пытаюсь сделать процедуры в разных базах данных. Я не должен знать имя базы данных. Я попытался сделать курсоры вложенности, первый из которых получил имена баз данных динамическим способом, а другой - для создания/изменения процедур; Я использовал EXISTS для создания процедур и NOT EXISTS для их изменения. Но как-то база данных прилипает к «хозяину», и она никогда не пересекает других. Я знаю, что есть проблема с моим внутренним курсором вложенности, хотя я понятия не имею, что это. вот мое кодирование:Как создавать процедуры в разных базах данных с помощью курсора
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: Я не должен знать имя базы данных, потому что я пытаюсь написать процедуру «Общие», так что может применяться ко всем базам данных пользователей SQL-серверов , а не только мое.
P.S2: Я использовал Nesting Cursors, но из-за их катастрофического исполнения, я был бы признателен за другие пути!
Cheers!
Строка, которую вы должны выполнить exec sp_executesql cmd, не будет сохранена для остальной части сеанса относительно этого запуска cmd. Вот почему вы все еще в мастерской, то есть «USE dbname» отправляется, а затем забывается. –
И кажется немного странным, что вам не разрешено знать имена баз данных. Если у вас есть доступ к мастеру и вы можете выполнить этот фрагмент кода, это будет подразумеваться ... :) –
@NickPfitzner Я попробовал использовать + DBName, но это не сработало, поэтому я переключился на это. Что ты предлагаешь? –