尝试参数化表名时,为什么会收到不正确的语法错误?

时间:2014-06-23 13:57:03

标签: c# sql

我有以下代码:

string strTruncateTable = "TRUNCATE TABLE @TableNameTruncate";
SqlCommand truncateTable = new SqlCommand(strTruncateTable, myConnection);              
truncateTable.Parameters.AddWithValue("TableNameTruncate", tbTableName.Text);
truncateTable.ExecuteNonQuery();

每当我运行应用程序时,都会出现以下错误:

  

' @ TableNameTruncate'

附近的语法不正确

如何解决问题?

3 个答案:

答案 0 :(得分:4)

  

如何解决问题?

通过将表名指定为SQL的一部分。表和列名称不能在大多数数据库SQL方言中进行参数化,包括SQL Server。

在将表名放入SQL之前,您应该对表名执行非常严格的验证,或者使用一组列有效的表名,以便以正常方式避免SQL注入攻击。

答案 1 :(得分:1)

无论您使用DML语句还是DDL语句,都只能参数化,而不是列名或表名。

顺便说一句, Data manipulation language 操作支持的参数不是Data Manipulation language操作。

数据操作语言=

SELECT ... FROM ... WHERE ...
INSERT INTO ... VALUES ...
UPDATE ... SET ... WHERE ...
DELETE FROM ... WHERE ...

TRUNCATE TABLEData Definition Language statement。这就是为什么即使只是在尝试参数值时也不能将TRUNCATE TABLE与参数一起使用的原因。您需要将其指定为SQL查询的一部分。

您可能需要查看名为Dynamic SQL

的术语

答案 2 :(得分:1)

如Jon Skeet所述,无法对截断操作进行参数化。

要解决此问题,需要编写完全限定的查询。

因此,您可以通过参数值@TableNameTruncate进行条件检查,并使用if或switch case语句创建完全限定查询然后执行它。

或只是

string strTruncateTable = "TRUNCATE TABLE " + TableNameTruncate.Value;
SqlCommand truncateTable = new SqlCommand(strTruncateTable, myConnection);              
truncateTable.Parameters.AddWithValue("TableNameTruncate", tbTableName.Text);
truncateTable.ExecuteNonQuery();