我使用一段代码来遍历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]。但我还没有找到解决问题的办法。谢谢你的帮助。
答案 0 :(得分:3)
您需要为此任务嵌套动态SQL,因为proc CREATE
或ALTER
必须是批处理中的第一个语句:
SET @sql= N'EXEC(N''USE ' + QUOTENAME(@dbname) + N';EXEC(N''''CREATE PROC...;'''')'')';