2013-05-06 20 views
3

我有100個數據庫,我需要對過程進行更改,它們都具有相同的過程。我如何添加一個可以讓我做這個改變的光標?如何在SQL遊標中修改

DECLARE @databasename varchar(100) 
DECLARE @Command nvarchar(200) 

DECLARE database_cursor CURSOR FOR 
SELECT name 
FROM MASTER.sys.sysdatabases 

OPEN database_cursor 

FETCH NEXT FROM database_cursor INTO @databasename 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @Command = 'ALTER PROCEDURE ''' + @databasename + '''.[dbo].[DeleteAccountUpgrade] 
       @Id INT 
      AS 
       DELETE FROM AccountUpgrades WHERE Id = @Id' 
    EXEC sp_executesql @Command 

    FETCH NEXT FROM database_cursor INTO @databasename 
END 

CLOSE database_cursor 
DEALLOCATE database_cursor 

它說,我需要聲明@Id,但我不明白爲什麼,我只是想運行的每個數據庫上改變,我不發送任何數據來執行的程序,我只是想修改所有數據庫的現有程序。

+1

這的確是一個問題,部署;我不會試圖從純粹的TSQL做到這一點。您是否考慮過使用[SQLCMD變量](http://msdn.microsoft.com/zh-cn/library/ms188714.aspx),或者只是編寫一個小型部署腳本,可以對任何服務器/數據庫執行新的DDL腳本你需要?如果您按照您嘗試的方式部署源代碼,那麼管理源代碼將非常困難。 – Pondlife 2013-05-06 15:45:23

+1

CREATE/ALTER PROCEDURE不允許指定數據庫名稱作爲對象名稱的前綴。 – 2013-05-06 16:56:10

回答

1

使用巢sp_executesql的調用。這使您可以對其他數據庫執行DDL。

DECLARE @databasename varchar(100) 
DECLARE @Command nvarchar(200) 

DECLARE database_cursor CURSOR FOR 
SELECT name 
FROM MASTER.sys.sysdatabases 

OPEN database_cursor 

FETCH NEXT FROM database_cursor INTO @databasename 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @Command = N'USE ' + QUOTENAME(@databasename) + 
        ' EXEC sp_executesql N''ALTER PROCEDURE [dbo].[DeleteAccountUpgrade] ' + 
        '@Id INT ' + 
        'AS ' + 
        'DELETE FROM AccountUpgrades WHERE Id = @Id''' 
    --PRINT @Command 
    EXEC sp_executesql @Command 

    FETCH NEXT FROM database_cursor INTO @databasename 
END 

CLOSE database_cursor 
DEALLOCATE database_cursor 
1

您需要通過自身使用EXEC,而不是與sp_executesql

EXEC sp_executesql @Command 

應改爲:

EXEC(@Command) 

sp_executesql過程確實有變量參數。這是錯誤來自的地方。另請參見https://stackoverflow.com/a/16308447/1822514