2012-04-22 46 views
1

我想创建一个脚本来创建和填充表,然后为我的应用程序创建存储过程来访问它们。我的脚本运行良好,直到我到达存储过程。我试图将.sql文件读入我的应用程序,然后在一次执行中通过我的连接运行此脚本。有什么办法可以从脚本的这个块中删除'go'关键字,使它在一次执行中运行?如何在不使用'go'的情况下运行这个sql脚本?

if object_id('GetStudentByID') is not null 
drop procedure GetStudentByID; 
go 
create procedure GetStudentByID 
(@StudentID INT) 
as 
select StudentID,FirstName,LastName 
from Student 
where StudentID = @StudentID; 
+0

为什么不把它分成两个独立的sql查询? – Hajo 2012-04-22 19:01:39

+0

因为会有几个像这样的存储过程。 – Bazinga 2012-04-22 19:03:10

回答

5

这样的:

if object_id('GetStudentByID') is not null 
    EXEC('drop procedure GetStudentByID;'); 

EXEC('create procedure GetStudentByID 
(@StudentID INT) 
as 
select StudentID,FirstName,LastName 
from Student 
where StudentID = @StudentID;'); 

这是一个常见的问题,因为,虽然它不是立即显现, “GO” 是一个SQL Server命令。相反,它是由Management Studio(和SQLCMD)实施的一个命令,用于告诉它如何将SQL命令文本流划分为单独的可编译批处理。

由于SQL Server本身没有这样的命令,所以在需要SQL脚本以适应存储过程,代理作业等的情况下,您必须采用不同的方式。SOP的方式是通过dyanmic SQL使用sp_executeCmd(...)EXEC('string')(如上)。

0

您必须在一个批次中有CREATE PROCEDURE。我不确定你想要达到什么目的。 您是否要执行单个命令,因为您无法将应用程序编程为执行多次?如果是这样,然后尝试为每个过程设置一个循环(如果无法使其工作,请在此处回传代码:))

如果您想一起执行它们,以便它们全部失败或一起成功然后将它们包装在交易中。然后你可以保留GO批处理分隔符,但是他们会一直等到结束提交它们。

e.g

BEGIN TRANSACTION; 
GO 

if object_id('GetStudentByID') is not null 
drop procedure GetStudentByID; 
go 
create procedure GetStudentByID 
(@StudentID INT) 
as 
select StudentID,FirstName,LastName 
from Student 
where StudentID = @StudentID; 
GO 
/* replace this line with other procedures */ 

COMMIT TRANSACTION; 
GO 
+0

循环是我目前用来做到这一点。我主要只是好奇在做这个过程时是否有办法摆脱'go'关键字。我正在阅读.sql文件,并在'go'关键字处进行分割,然后循环。我只是想知道是否有更干净的方式来做到这一点。 – Bazinga 2012-04-22 19:38:38

相关问题