2016-02-17 33 views
3

我希望從一些C#代碼中創建一個臨時存儲過程。雖然它是一個臨時存儲過程,但如果它已存在以確保連接保持打開狀態,我希望將其刪除,但當我嘗試第二次創建連接時,我不會遇到問題。從C中刪除並創建存儲過程#

我有大意如下這個SQL:

IF OBJECT_ID('tempdb..#usp_GetSomething') IS NOT NULL 
BEGIN 
    DROP PROC#usp_GetSomething 
END 
GO 

CREATE PROCEDURE #usp_GetSomething 
    @Table VARCHAR(100) 
AS 
BEGIN 
    SELECT @Table 
END 

這是有效的SQL和Management Studio中執行。 然而,當我用下面的C#來執行它:

var cmd = new SqlCommand(theSQL, sqlConnection) {CommandType = CommandType.Text}; 
cmd.ExecuteNonQuery(); 

我得到以下錯誤:

附近有語法錯誤 'GO'。必須聲明標量變量「@Table」。

我在做什麼錯?我怎樣才能讓SQL執行?

+0

(我簡化了實際的存儲過程) – andrew

+0

你試過刪除'GO'嗎? –

+1

@JDHooper這不是有效的SQL。 「CREATE PROCEDURE必須是批處理中唯一的語句」 – andrew

回答

-1

使用StoredProcedure代替的CommandText象下面這樣:

using (var conn = new SqlConnection(connectionString)) 
using (var command = new SqlCommand("ProcedureName", conn) { 
          CommandType = CommandType.StoredProcedure }) { 
    conn.Open(); 
    command.ExecuteNonQuery(); 
    conn.Close(); 
} 
+0

這會引發以下情況:傳入的表格數據流(TDS)遠程過程調用(RPC)協議流不正確。 RPC名稱無效。 – andrew

+0

您可以在此處設置您的第一個參數的類型和長度 command.Parameters.Add(new SqlParameter(「@ errMessage」,SqlDbType.NVarChar,8000)); 如果參數的長度與數據庫中指定的長度不同(大於或小於),則會出現錯誤。 希望這會有所幫助。 – Akhilesh

+0

我會使用這種方法存儲過程,我試圖執行,但我沒有一個參數,我需要設置的值。該參數在我嘗試創建的存儲過程中。 – andrew

0

This is valid SQL

這是不對的。

GO不是SQL關鍵字。它是由SSMS和IIRC SQLCmd認可的批分離器。

從代碼中,您必須將此SQL分成多個語句(每個GO)並分別提交它們。