sp_execute用于多个动态T-SQL语句和批处理

时间:2016-11-05 17:55:17

标签: sql sql-server tsql batch-file sp-executesql

理想情况下,我想将几​​个sql语句作为单个exec sp_executesql语句执行。一个例子是我使用一个IF EXISTS来确定是否运行第二个语句:

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

我以为“;”可以充当声明终结者

1 个答案:

答案 0 :(得分:0)

  

我也知道SQL注入以及如何对抗它。我是合情合理的   很高兴这两个语句都是很好的SQL

在这个问题中没有足够的证据证明这一点。您应该使用参数化和QUOTENAME

  

我以为“;”可以充当声明终结者

确实如此,但你不想在那里使用语句终止符。

IF 1=1; SELECT 'Foo';

语法无效。

IF 1=1 SELECT 'Foo';
然而,

会正常工作。您只需要在Boolean_expression之后用空格替换分号。