2016-11-16 8 views
1

По некоторым причинам я пытаюсь создать динамический скрипт для удаления ранее созданных таблиц. Я не мог правильно использовать синтаксис, и мне нужна помощь в этом вопросе.Как создать sp_executesql для вывода таблиц dynamicaly

Когда я бегу мой сценарий, он выдает ошибку:

"Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'."

и это мой сценарий. У меня есть ошибка в заявлении sp_executesql, я думаю. Как я могу это исправить?

DECLARE @sql VARCHAR(MAX); 
DECLARE @tmpTableName VARCHAR(max); 
SET @tmpTableName = '##gmAAA_COLLATION'; 

SET @sql = 'DROP TABLE @tmpTableName'; 

EXEC sp_executesql @sql, N'@tmpTableName NVARCHAR(max)', @tmpTableName; 
+0

Как вы создали эту глобальную таблицу темп в первую очередь? Также динамически? – Squirrel

ответ

2

Вы не можете сделать это со статическим SQL, т. Е. Имя таблицы никогда не может быть параметром в операторах SQL, подобных этим. Это также верно для имен столбцов, имена схем и т.д.

Если вы хотите сделать это с помощью sp_executesql, вы можете создать SQL динамически следующим образом:

SET @sql = 'DROP TABLE '+QUOTENAME(@tmpTableName); 

EXEC sp_executesql @sql; 

PS: @stmt параметр процедура sp_executesql должна быть типа NVARCHAR(...).

+0

Большое вам спасибо, вы правы –

0

Попробуйте следующий запрос: -

SET @sql = 'DROP TABLE @tmpTableName'; EXEC (@sql) 

OR 

DECLARE @sql NVARCHAR(MAX); 
DECLARE @tmpTableName NVARCHAR(max) 
SET @tmpTableName = '##gmAAA_COLLATION'; 


SET @sql = 'DROP TABLE'+QUOTENAME(@tmpTableName); 

EXEC sp_executesql @sql,N'@tmpTableName NVARCHAR(max)',@tmpTableName 
+0

Мне нужно использовать sp_executesql, потому что я могу использовать INSERT statemtn вместо DROP –

+0

@Mansoor, какова цель '@ tmpTableName' внутри динамического запроса? Он вообще не используется – Squirrel

1

sp_executesql требует NVARCHAR для @stmt и @params параметры

так изменить типы данных переменных образуют varchar быть nvarchar следующим

DECLARE @sql NVARCHAR(MAX); 
DECLARE @tmpTableName VARCHAR(max); 
+0

Я уже это сделал, но теперь он говорит «Неверный синтаксис рядом с« @tmpTableName ».» –