@args不是过程

时间:2017-06-16 11:16:45

标签: c# sql-server stored-functions

我正在尝试使用字符串作为参数(VARCHAR (MAX))来调用存储过程,但是它一次又一次地告诉我@args参数不是肯定的。这是我的测试程序:

IF OBJECT_ID ( 'TEST', 'P' ) IS NOT NULL   
    DROP PROCEDURE TEST;  
GO

CREATE PROCEDURE TEST (@args varchar (max)) AS
BEGIN
    EXEC sp_execute_external_script
    @language = N'R'
    , @script = N'OutputDataSet <- as.data.frame(...);'
    , @params = N'@args varchar(max)'
    , @args = @args
WITH RESULT SETS ((...));
RETURN 0;
END

如果我从管理工作室打电话,它可以工作:

SET LANGUAGE ENGLISH
EXEC dbo.TEST @args = 'long string'
GO

但不是通过C#

public static void Main()
{
    Console.WriteLine("Connection test!");
    Console.WriteLine("Press ESC to stop");

    string ConnectionString = "...";
    SqlConnection conn = new SqlConnection(ConnectionString);
    SqlCommand    cmd  = new SqlCommand("TEST");
    SqlDataReader rdr  = null;

    string args = "very long string";

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection  = conn;
    cmd.Parameters.Add("@args", SqlDbType.VarChar, -1).Value = args;
    conn.Open();

    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;
    try { cmd.ExecuteNonQuery(); } // @args is not a parameter for TEST Procedure
    catch (SqlException ex)

我没有重复使用任何只是varchar(max)的参数。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最后我发现了一个非常愚蠢的错误。

简短回答:在删除和创建proc之前添加了SQL USE语句。

USE myDB;
GO

答案很长:事实证明我有2个DB而且我在master中创建了SP但是我在测试数据库中有另一个程序。因此,虽然我删除了SP,但是另一个DB中有另一个具有相同名称但参数不同,因此出错。由于我无法理解为什么@args不正确,我列出了SP参数(https://stackoverflow.com/a/3038470/2846161https://stackoverflow.com/a/3038530/2846161),结果证明该程序甚至被删除,因此它被复制了。