2016-11-05 9 views
0

В идеале я хотел бы выполнить несколько операторов sql как один оператор sp_executesql. Примером может быть там, где я использую один IF EXISTS, чтобы определить, если запустить второе заявление:sp_execute для нескольких динамических операторов T-SQL ak a batch

drop proc ai_ImportDataAddListPosn 
go 

create proc ai_ImportDataAddListPosn(@ParamTableName NVARCHAR(255), @debug INT) 
AS 
BEGIN 
DECLARE @sql AS NVARCHAR(4000) 
SET @sql = N'IF NOT EXISTS(SELECT * FROM syscolumns INNER JOIN sysobjects ON syscolumns.id = sysobjects.id WHERE sysobjects.name = ''' + @ParamTableName + ''' AND Syscolumns.name = ''ListPosn'');' 
      + 'alter table [' + @ParamTableName + '] add ListPosn int identity(1,1)' 
IF @debug = 1 PRINT @sql 
EXEC sp_executesql @sql 
END 
Go 

EXEC ai_ImportDataAddListPosn DeptForMove, 1 

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

Я думал, что «;» может выступать в качестве терминатора выписки

+0

Вам нужно вставить новую строку перед 'alter'. –

ответ

0

Я также осведомлен о внедрении SQL и о том, как бороться с ним. Я достаточно рад, что оба оператора хороши SQL

В этом вопросе мало свидетельств. Вы должны использовать параметризацию и QUOTENAME.

Я думал, что «;» может выступать в качестве терминатора выписки

Он делает, но вы не хотите, чтобы терминатор термина был там.

IF 1=1; SELECT 'Foo'; 

недействительный синтаксис.

IF 1=1 SELECT 'Foo'; 

будет работать нормально однако. Вам просто нужно заменить точку с запятой после вашего Boolean_expression пробелом.

+0

Я думал, что у меня была отладочная печать, указывающая на то, что у меня есть выход и возможность запуска сгенерированного sql (что я и сделал). Я разделил заявления, и они оба разобрались. Спасибо, что указали неверный синтаксис. На самом деле я сам пришел к выводу о параметризации, но не подумал, что может быть фактический ответ, который стоит после четвертого нерелевантного редактирования исправлений. Ваш ответ стоит над грязной толпой редакторов OCD. – user2711068

 Смежные вопросы

  • Нет связанных вопросов^_^