1

我正在尝试创建一个脚本来创建和填充表,然后为我的应用程序创建存储过程以访问它们。我的脚本运行得很好,直到我进入存储过程。我正在尝试将 .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;
4

2 回答 2

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 方法是使用sp_executeCmd( ...)EXEC('string')(如上)。

于 2012-04-22T19:36:48.733 回答
0

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

如果您想一起执行它们以便它们在同一时间点一起失败或成功,则将它们包装在事务中。然后你可以保留 GO 批处理分隔符,但它们会等到最后才提交它们。

例如

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
于 2012-04-22T19:31:16.107 回答