如何将表名传递给SqlCommand?
我试图通过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( );
数据操作语言操作支持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注入 )您可能需要查看名为Dynamic SQL的术语
也可以使用using
语句来配置你的SqlConnection
和SqlCommand
类的;
using(SqlConnection con = new SqlConnection(ConnectionString)) using(SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = "drop table " + "SampleTable"; con.Open() cmd.ExecuteNonQuery(); }
用户SonerGö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
这个问题的代码。