我试图通过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( );
答案 0 :(得分:8)
SqlCommand.Parameters
操作支持Data manipulation language而不是 Data definition language 操作。
即使您使用DML,也无法参数化您的表名或列名等。您只能参数化您的值。
数据操作语言=
SELECT ... FROM ... WHERE ...
INSERT INTO ... VALUES ...
UPDATE ... SET ... WHERE ...
DELETE FROM ... WHERE ...
数据定义语言=
CREATE TABLE ...
DROP TABLE ... ;
ALTER TABLE ... ADD ... INTEGER;
您不能将DROP
statement与参数一起使用。
如果确实必须使用drop语句,则可能需要在SqlCommand
上使用字符串连接。 (请注意SQL Injection)您可能需要查看名为Dynamic SQL
同时使用using
statement来处理您的SqlConnection
和SqlCommand
之类的内容;
using(SqlConnection con = new SqlConnection(ConnectionString))
using(SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "drop table " + "SampleTable";
con.Open()
cmd.ExecuteNonQuery();
}
答案 1 :(得分:2)
用户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
来自this question的代码。