sp_execute 对于多个动态 T-SQL 语句是一个批处理
sp_execute for multiple dynamic T-SQL statements ak a batch
理想情况下,我想将多个 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
我意识到这个例子并没有首先测试 table 的存在,它只是一个简化的例子而不是真正的问题。我也知道 SQL 注入以及如何对抗它。我很高兴这两个陈述都很好 SQL
我以为是“;”可以充当语句终止符
I also am aware of SQL injection and how to combat it. I'm reasonably
happy that both statements are good SQL
问题中几乎没有证据表明这一点。您应该使用参数化和 QUOTENAME
.
I thought the ";" may act as a statement terminator
确实如此,但您不想在那里使用语句终止符。
IF 1=1; SELECT 'Foo';
语法无效。
IF 1=1 SELECT 'Foo';
但是可以正常工作。您只需要将 Boolean_expression
后的分号替换为白色 space.
理想情况下,我想将多个 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
我意识到这个例子并没有首先测试 table 的存在,它只是一个简化的例子而不是真正的问题。我也知道 SQL 注入以及如何对抗它。我很高兴这两个陈述都很好 SQL
我以为是“;”可以充当语句终止符
I also am aware of SQL injection and how to combat it. I'm reasonably happy that both statements are good SQL
问题中几乎没有证据表明这一点。您应该使用参数化和 QUOTENAME
.
I thought the ";" may act as a statement terminator
确实如此,但您不想在那里使用语句终止符。
IF 1=1; SELECT 'Foo';
语法无效。
IF 1=1 SELECT 'Foo';
但是可以正常工作。您只需要将 Boolean_expression
后的分号替换为白色 space.