MS SQL循环遍历所有DB。脚本可以改变表而不是存储过程

时间:2017-10-27 18:40:09

标签: sql-server stored-procedures

我使用一段代码来遍历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

所以上面的代码完全正常。但是,当我改变代码而不是执行alter存储过程时,我会收到以下消息:

  

'创建/更改程序'不允许将数据库名称指定为对象名称的前缀。

我意识到消息说我不能在程序前面使用数据库名称,就像我在这里做的那样:ALTER程序[' + @ dbname +']。[dbo [spSelectSomething]。但我还没有找到解决问题的办法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

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

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