如何在不使用'go'的情况下运行此sql脚本?

时间:2012-04-22 18:58:10

标签: sql

我正在尝试创建一个脚本来创建和填充表,然后为我的应用程序创建存储过程来访问它们。我的脚本运行得很好,直到我到达存储过程。我正在尝试将.sql文件读入我的应用程序,然后在一次执行中通过我的连接运行此脚本。有没有什么办法可以从脚本的这个块中删除'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;

2 个答案:

答案 0 :(得分: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')(如上所述)。

答案 1 :(得分: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