在没有循环的情况下对结果集中的所有行执行动态sql

Nei*_*l P 6 sql sql-server sql-server-2012

我有一个查询,它为表中的每一行生成一个查询。

例如:

select ' create proc ['+[ProcName]+'] as 
       print '''+[ProcName]+''''
from MyTable
Run Code Online (Sandbox Code Playgroud)

这个查询的结果会给我一个 sql 语句,我可以为表中的每一行数据执行。

    CREATE PROC [proc_1]
AS
    PRINT 'proc_1'
Run Code Online (Sandbox Code Playgroud)

——

CREATE PROC [proc_2]
AS
    PRINT 'proc_2'
Run Code Online (Sandbox Code Playgroud)

等等。

是否可以执行结果集中的每一行而不必实现某种形式的游标/循环?

ahm*_*der 2

您可以通过多种方式连接 sql 传递变量中的所有列值

例如:XMLPATHSTUFFCOALESCE,以及对字符串的一些操作。

但仍然出现错误

此任务的主要问题是Go

Go无效的 T-SQL

因此,如果您尝试执行动态 sql contains Go,将引发下一个错误:-

消息 102,级别 15,状态 1,第 4 行“go”附近的语法不正确。

在浏览 stackoverflow 后,我在这里得到了解决:-

使用go in sql执行动态查询

所以获取下一个演示(在我的试验中应用上述链接后):-

演示:-

-- Try to create 4 procedures proc_1, proc_2 , proc_3 and proc_4
Create database Demo
go
use Demo
go

Create table MyTable (procName varchar (200))
go
insert into MyTable values ('proc_1')
go
insert into MyTable values ('proc_2')
go
insert into MyTable values ('proc_3')
go
insert into MyTable values ('proc_4')
go

declare @Query nvarchar(max)
SELECT @Query = isnull(@Query,'') + 'create proc ['+[ProcName]+'] as 
print '''+[ProcName]+''''+ char (10) + '
Go
'
FROM MyTable 
--print @Query
SET @Query = 'EXEC (''' + REPLACE(REPLACE(@Query, '''', ''''''), 'GO', '''); EXEC(''') + ''');'
EXEC (@Query)
Run Code Online (Sandbox Code Playgroud)

结果:-

在此输入图像描述

在此输入图像描述