SQL 当尝试在 C# 中传递 2 个参数时,服务器存储过程或函数指定的参数太多

SQL Server stored procedure or function has too many arguments specified, when trying to pass 2 arguments in C#

我正在尝试执行名为 getLastFeatureUpdate 的存储过程。

我将在下面逐步解释问题:

我在 SQL 中创建了一个 table,如下所示:

CREATE TABLE testTable
(
      DayTime INT     NOT NULL, /*yyddhhmm, 1010102345*/
      FeatureNbr      SMALLINT  NOT NULL,
      Val FLOAT(53)   NOT NULL
);

我现在已经创建了一个名为 getLastFeatureUpdate 的存储过程。这里需要注意的重要一点是我使用了 2 个参数 @maxDateTime@tableName,因为它们每次都不同。因此,我将在最后的 C# 代码中传递这两个参数。

存储过程(如果我从过程和 C# 代码中删除 @tableName text。那么代码确实有效)

CREATE PROCEDURE getLastFeatureUpdate
    @maxDateTime float(53) = 0,
    @tableName text
AS
    SELECT
        test.FeatureNbr,
        test.DayTime,
        test.Val
    FROM
        @tableName test 
    WHERE
        DayTime = (SELECT MAX(DayTime)
                   FROM @tableName
                   WHERE FeatureNbr = test.FeatureNbr --This is what you are missing
                     AND DayTime <= @maxDateTime)   --10102248

我想要 return 来自 testTable 的数据的 C# 代码。显示在:MessageBox.Show(d1 + "," + d2 + "," + d3);

但这是我收到错误的地方:

Procedure or function getLastFeatureUpdate has too many arguments specified

注意,如果我不使用 @tableName 传递第二行,代码将起作用(然后我必须删除 @tableName 作为存储过程中的参数 getLastFeatureUpdate)

cmd.Parameters.Add(new SqlParameter("@maxDateTime", 10102248));
cmd.Parameters.Add(new SqlParameter("@tableName", "testTable")); //If not using this parameter, the code will work

C#代码:

void getLastFeatureUpdate()
{
        using (SqlConnection conn = new SqlConnection(GetConnectionString()))
        {
            conn.Open();

            // 1. create a command object identifying the stored procedure
            SqlCommand cmd = new SqlCommand("getLastFeatureUpdate", conn);

            // 2. set the command object so it knows to execute a stored procedure
            cmd.CommandType = CommandType.StoredProcedure;

            // 3. add parameter to command, which will be passed to the stored procedure
            cmd.Parameters.Add(new SqlParameter("@maxDateTime", 10102248));
            cmd.Parameters.Add(new SqlParameter("@tableName", "testTable")); //If not using this parameter, the code will work

            // execute the command
            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                // iterate through results, printing each to console
                while (rdr.Read())
                {
                    int v1 = (int)rdr["DayTime"];
                    int v2 = (Int16)rdr["FeatureNbr"];
                    double v3 = (double)rdr["Val"];

                    MessageBox.Show(v1 + "," + v2 + "," + v3);
                }
            }
        }
}

static private string GetConnectionString()
{
    return "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\andre\source\repos\TestDatabaseCreation\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30";
}

您不能在 SQL 服务器中参数化 table 名称,因此:SQL 无效,而 CREATE PROC 实际上没有 运行 . old proc 的内容是什么:只有你知道,但是:它不是显示的代码。它可能是您在开发的某个阶段拥有的虚拟版本。尝试输入:

exec sp_helptext getLastFeatureUpdate;

具体来说,服务器应该告诉你:

Msg 1087, Level 16, State 1, Procedure getLastFeatureUpdate, Line 12 [Batch Start Line 0]
Must declare the table variable "@tableName".
Msg 1087, Level 16, State 1, Procedure getLastFeatureUpdate, Line 19 [Batch Start Line 0]
Must declare the table variable "@tableName".