2016-11-05 54 views
0

理想情況下,我希望將多個sql語句作爲單個exec sp_executesql語句執行。一個例子是,我使用一個IF EXISTS以確定是否運行第二個聲明:sp_execute用於多個動態T-SQL語句ak批處理

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(我做了)。我拆分了這些語句,並對它們進行了解析。感謝您指出無效的語法。實際上,我自己接受了參數化的結論,但放棄了認爲在第四個不相關的勘誤編輯之後可能會有實際的迴應。你的迴應高於強迫症編輯的泥濘人羣。 – user2711068