我正在尝试创建一个sql脚本,但收到错误:
'CREATE / ALTER PROCEDURE'必须是查询中的第一个语句 批次??
这是我的代码:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'myproc') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[myproc]
create PROCEDURE [dbo].[myproc]
AS
BEGIN
select * from mytable
END
GO
答案 0 :(得分:46)
以下列形式运行您的陈述:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'myproc') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[myproc]
GO
create PROCEDURE [dbo].[myproc]
AS
BEGIN
select * from mytable
END
GO
请注意GO
DROP PROCEDURE
批处理分隔符
答案 1 :(得分:25)
您收到的错误消息是正确的。您可以使用GO关键字终止批处理(并启动另一个批处理)。
将GO放在Create过程语句之前。 GO语句必须单独排在一行。
答案 2 :(得分:10)
我经常希望与你提出的要求相反。例如,如果用户已经自定义了一个过程,并且我不想丢失他们的更改,但我想为所有客户端应用统一的更新脚本,我希望能够执行以下操作:< / p>
if not exists ( select * from sys.objects
where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
create proc myProc
as begin
-- proc stmts here
end
go
这个逻辑只允许我创建一些不存在的东西,但令我非常沮丧的是,SQL Server也阻止了它。
我可以轻松地解决这个问题,如下所示:
if not exists ( select * from sys.objects
where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
exec('create proc myProc
as begin
-- proc stmts here
declare @object int = 0
end')
go
通过将create proc命令作为字符串传递并将其放在exec语句中,我们绕过了一个阻止人们首先执行此操作的愚蠢规则。
答案 3 :(得分:4)
在我添加以下声明后,我的问题消失了:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
答案 4 :(得分:2)
您可能希望尝试在另一个数据库中创建存储过程,而不是在当前上下文中创建它。
set @myScript = 'exec '+ QUOTENAME(@DBName) + '..sp_executesql N''create PROCEDURE [dbo].[myproc] AS BEGIN select * from mytable END''' execute(@myScript)