Как я могу передать имя таблицы в 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( );

person Uthaiah    schedule 29.04.2014    source источник


Ответы (2)


SqlCommand.Parameters поддерживаются для операций языка обработки данных, не < href="https://en.wikipedia.org/wiki/Data_definition_language" rel="noreferrer">язык определения данных.

Даже если вы используете 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 оператор, чтобы избавиться от лайков SqlConnection и SqlCommand;

using(SqlConnection con = new SqlConnection(ConnectionString))
using(SqlCommand cmd = con.CreateCommand())
{
   cmd.CommandText = "drop table " + "SampleTable";
   con.Open()
   cmd.ExecuteNonQuery();
}
person Soner Gönül    schedule 29.04.2014
comment
На самом деле это не вопрос DML или DDL: было бы одинаково проблематично вставить имя таблицы или имя столбца в оператор SELECT. Параметры SQL просто ограничены местами, где вы можете поместить переменные в SQL, и вы не можете использовать переменные при обращении к объектам базы данных. - person StriplingWarrior; 05.06.2021

Пользователь 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

Код из этого вопроса.

person Sriram Sakthivel    schedule 29.04.2014