2012-04-22 91 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

相關問題