2016-11-05 81 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