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