必须声明表变量" @ TableName"

时间:2015-11-15 19:09:28

标签: c# sql sql-server

我在Visual Studio中为此部分代码收到此错误。为什么?我确实在下面将@TableName声明为FormField。

  

必须声明表变量" @ TableName"。

代码:

using (SqlCommand sqlCmd2 = new SqlCommand())
{
    sqlCmd2.Connection = sqlConn2;
    sqlCmd2.CommandType = System.Data.CommandType.Text;
    sqlCmd2.CommandText = string.Format("SELECT DisplayName AS MyColumn FROM @TableName WHERE EventId = 1 AND Visible = 1");
    sqlCmd2.Parameters.Add("@TableName", SqlDbType.NVarChar).Value = "FormField";
    sqlCmd2.ExecuteNonQuery();
}

2 个答案:

答案 0 :(得分:3)

使用参数无法解析表名。为此,您必须在转到SqlCommand时准备您的陈述:

string tableName = "FormField";

using (SqlCommand sqlCmd2 = new SqlCommand())
    {
        sqlCmd2.Connection = sqlConn2;
        sqlCmd2.CommandType = System.Data.CommandType.Text;
        sqlCmd2.CommandText = string.Format("SELECT DisplayName AS MyColumn FROM {0} WHERE EventId = 1 AND Visible = 1", tableName );

        sqlCmd2.ExecuteNonQuery();

    }

SqlParameter只能用于传递参数。例如。在插入或更新语句中。但是如果你想这样做,请确保不能从源代码外部更改tableName以防止在任何情况下进行sql注入。您可以在执行任何查询之前过滤可接受的值。

答案 1 :(得分:1)

您不能将表名(或列名或函数或运算符)指定为参数。

因此,在您的查询中,@TableName被解释为表变量,而不是参数,并且未定义表变量。

唉,你需要使用字符串操作显式地放置表。