2016-02-17 37 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)并分别提交它们。