@args 不是过程的参数
@args is not a parameter for procedure
我正在尝试使用字符串作为参数 (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)。有什么想法吗?
最后我发现了一个非常愚蠢的错误。
简短回答:在删除和创建过程之前添加了 SQL USE
语句。
USE myDB;
GO
长答案:原来我有 2 个数据库,我在 master 中创建 SP,但我的测试数据库中有另一个过程。因此,尽管我删除了 SP,但在另一个数据库中还有另一个同名但参数不同的 SP,因此出现错误。由于我不明白为什么@args
不正确,我列出了SP参数(, )结果发现该过程被列出甚至被删除,因此它被复制了。
我正在尝试使用字符串作为参数 (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)。有什么想法吗?
最后我发现了一个非常愚蠢的错误。
简短回答:在删除和创建过程之前添加了 SQL USE
语句。
USE myDB;
GO
长答案:原来我有 2 个数据库,我在 master 中创建 SP,但我的测试数据库中有另一个过程。因此,尽管我删除了 SP,但在另一个数据库中还有另一个同名但参数不同的 SP,因此出现错误。由于我不明白为什么@args
不正确,我列出了SP参数(, )结果发现该过程被列出甚至被删除,因此它被复制了。