所以我試圖在不同的數據庫中創建過程。我不應該知道數據庫的名稱。我試圖製作嵌套遊標,第一個是以動態方式獲取數據庫的名稱,另一個是創建/更改過程;我用EXISTS來創建一個程序,而不是用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:我使用了嵌套遊標,但由於它們的災難性表現,我會很欣賞其他方式!
乾杯!
你必須給exec sp_executesql的CMD將不會舉行的會議相對於CMD的運行中的其餘線路。這就是爲什麼你仍然在掌握,即「USE數據庫名稱」被髮送,然後被遺忘。 –
看起來有點奇怪,你不能知道數據庫名稱。如果你有權訪問主,並且可以執行這段代碼,那就暗示着...... :) –
@NickPfitzner我嘗試過'use + DBName',但它沒有工作,所以我轉而使用它。你有什麼建議? –