2015-07-17 3 views
1

У меня динамический SQL запросSQL Server Dynamic SQL Execution

DECLARE @ItemAreaCode NVARCHAR(MAX) = 'A062', 
     @SQLStringDropTable NVARCHAR(MAX); 

SET @SQLStringDropTable= 'DROP TABLE' + ' ' + 
         '[@ItemAreaCode].[ChangedRMAllocation]' 

PRINT @ItemAreaCode 

EXEC sp_executesql @SQLStringDropTable , N'@ItemAreaCode NVARCHAR(MAX)', @ItemAreaCode; 

Но когда я исполню это, я получаю эту ошибку:

Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '@ItemAreaCode.ChangedRMAllocation', because it does not exist or you do not have permission.

И печатное запрос ..

DROP TABLE [@ItemAreaCode].[ChangedRMAllocation]; 

Что мне нужно:

DROP TABLE [A062].[ChangedRMAllocation]; 

ответ

1

вероятно Вы имели в виду расширить переменную:

DECLARE @ItemAreaCode sysname = 'A062', 
    @SQLStringDropTable NVARCHAR(MAX); 

SET @SQLStringDropTable = 
    'DROP TABLE ' + quotename(@ItemAreaCode) + '.[ChangedRMAllocation]'; 
EXEC (@SQLStringDropTable); 
+0

Если параметр не является имя таблицы, Могу ли я использовать запрос, как у меня в этом вопросе? – tarzanbappa

+1

Лучше избегать динамического SQL, если можно. Параметризированные запросы почти всегда предпочтительны. – Andomar

3

Вы устанавливаете вы параметр в виде строки в динамическом SQL. @ItemAreaCode не следует включать.

Это должно работать:

DECLARE @ItemAreaCode NVARCHAR(MAX) = 'A062', 
@SQLStringDropTable NVARCHAR(MAX); 

    SET @SQLStringDropTable= 'DROP TABLE' + ' [' 
          + @ItemAreaCode + '].[ChangedRMAllocation]' 

    PRINT @ItemAreaCode 
    EXEC (@SQLStringDropTable); 

Надеется, что это помогает

+1

Согласитесь, что переменная должна быть расширена в строке (хотя лучше с 'quotename'), но почему вы все еще передаете ее как параметр' sp_executesql'? – Andomar

+1

@Andomar Мне нужно написать запрос, предупреждающий SQL-инъекцию. Вот почему я использовал sp_executesql и передавал в него параметры. Если этот ответ неправильный, как это сделать – tarzanbappa

+1

@tarzanbappa: этот ответ уязвим для SQL-инъекции через '@ItemAreaCode = ']; важно переименовать базу данных; - «например». Вы не можете передавать имена таблиц в качестве параметров. Используйте 'quotename', чтобы избежать SQL-инъекции. – Andomar

1

Попробуйте

DECLARE @ItemAreaCode NVARCHAR(MAX) = 'A062' 
    ,@SQLStringDropTable NVARCHAR(MAX); 

SET @SQLStringDropTable = 'DROP TABLE [' + @ItemAreaCode + '].[ChangedRMAllocation]' 

EXEC (@SQLStringDropTable)