我可以翻译成中文。问题是如何将表名传递给SqlCommand?

5

我正在尝试通过SqlCommand将表名作为参数传递给我的查询,但似乎并没有起作用。以下是我的代码:

SqlConnection con = new SqlConnection( "server=.;user=sa;password=12345;database=employee" );
con.Open( );
SqlCommand cmd = new SqlCommand( "drop table @tbName" , con );
cmd.Parameters.AddWithValue( "@tbName" , "SampleTable" );
cmd.ExecuteNonQuery( );
con.Close( );
2个回答

10

SqlCommand.Parameters仅支持数据操作语言操作,而不支持数据定义语言操作。

即使您使用DML,也无法为表名或列名等参数化。 您只能为值参数化

数据操作语言 =

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

数据定义语言 =

CREATE TABLE ... 
DROP TABLE ... ;
ALTER TABLE ... ADD ... INTEGER;

您不能使用带参数的 DROP 语句
如果您真的需要使用drop语句,则可能需要在您的 SqlCommand 上使用字符串连接。 (注意SQL注入)您可能需要查看术语动态SQL
此外,使用 using 语句 处理您的 SqlConnectionSqlCommand,如下所示;
using(SqlConnection con = new SqlConnection(ConnectionString))
using(SqlCommand cmd = con.CreateCommand())
{
   cmd.CommandText = "drop table " + "SampleTable";
   con.Open()
   cmd.ExecuteNonQuery();
}

这并不是DML与DDL的问题:将表名或列名插入SELECT语句同样会带来问题。SQL参数仅限于在SQL中放置变量的位置,而在引用数据库对象时无法使用变量。 - StriplingWarrior

3

用户Soner Gönül指出它为什么不工作,但是您可以自己编写存储过程。

CREATE PROCEDURE dbo.procdroptable
    @TABLENAME SYSNAME
AS
 BEGIN
    SET NOCOUNT ON;
    DECLARE @SQL NVARCHAR(MAX)
    SELECT @SQL = 'DROP TABLE dbo.' + QUOTENAME(@TABLENAME) + '';
    EXEC sp_executesql @SQL;
 END
GO

以下是来自这篇问题的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接