MS SQL循环通过所有数据库.脚本可以改变表,但不能改变存储过程



我使用一段代码在MS SQL服务器上的所有数据库中循环。它可以很好地更改表上的列,也可以更新数据。但是,在尝试更改存储过程时,我仍然会遇到错误。这是代码:

use master
declare @dbname varchar(100)
,@sql varchar(max)
declare db_cur cursor for
SELECT name
FROM sys.databases where ([name] like 'ce%')
and [state] = 0   
open db_cur
fetch next from db_cur into @dbname
while @@FETCH_STATUS = 0
begin
set @sql=
'ALTER TABLE ['+@dbname+'].[dbo].MyStuff
ADD myNewColumn bit NULL DEFAULT(0)
'
exec(@sql)
fetch next from db_cur into @dbname
end
close db_cur
deallocate db_cur

所以上面的代码运行得非常好。但是,当我更改代码以执行更改存储过程时,我会收到以下消息:

'CREATE/ALTER PROCEDURE'不允许将数据库名称指定为对象名称的前缀。

我意识到消息中说我不能像在这里那样在过程前面使用数据库名称:ALTER过程['+@dbname+']。[dbo]。[spSelectSomething]。但我一直想不出解决这个问题的办法。谢谢你的帮助。

您需要为此任务嵌套动态SQL,因为procCREATEALTER必须是批处理中的第一条语句:

SET @sql= N'EXEC(N''USE ' + QUOTENAME(@dbname) + N';EXEC(N''''CREATE PROC...;'''')'')';

最新更新