2017-02-14 24 views
4

我有一個查詢爲表中的每一行生成查詢。爲沒有循環的結果集中的所有行執行動態sql

例如:

select ' create proc ['+[ProcName]+'] as 
     print '''+[ProcName]+'''' 
from MyTable 

此查詢的結果會給我一個SQL語句,我可以執行對錶中的數據中的每一行。

CREATE PROC [proc_1] 
AS 
    PRINT 'proc_1' 

-

CREATE PROC [proc_2] 
AS 
    PRINT 'proc_2' 

是否有可能在我的結果集中執行的每一行,而不需要實現某種形式的光標/循環?

+0

多少PROC的你想以這種方式來創造?如果這麼多,這將是一個循環的問題,這可能不是一個好主意...... – HoneyBadger

+0

@HoneyBadger大概只有20左右,如果可能的話,它更能滿足我自己的好奇心:) –

回答

1

您可以通過多種方式

爲例串接在SQL傳遞變量的所有列值:XMLPATHSTUFFCOALESCE,一些MANIP用字符串來表示。

,但仍然獲得了該任務的錯誤

主要問題是Go

GoNot-Valid T-SQL

所以如果你試圖執行動態SQL包含Go,下一個錯誤將引發: -

消息102,級別15,狀態1,行4'go'附近的語法不正確。

衝浪計算器後,我得到了在這裏解決: -

Execute Dynamic Query with 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) 

結果: -

enter image description here

enter image description here

+1

偉大的解決方案,這也解決了在同一批中有兩個具有相同名稱的變量的潛在問題。 –

0

,你可以聲明一個變量,存儲裏面的查詢(方式隔開),並執行它

DECLARE @strQuery Varchar(MAX) 

SET @strQuery = '' 

select @strQuery = @strQuery + 
     'EXEC('' create proc [' + [ProcName] + '] 
     as 
     print ''''' + [ProcName] + ''''' 
     '')' 

from MyTable 

EXEC(@strQuery) 

--To view your query 

PRINT(@strQuery) 

注:我使用exec命令的每一道工序,因爲他們不能在同一時間在查詢執行

+0

引發一個錯誤:'Msg 156,Level 15,State 1,Procedure proc_1,Line 2 關鍵字'proc 」。 Msg 156,Level 15,State 1,Procedure proc_1,Line 3 關鍵字'proc'附近的語法不正確。 Msg 156,Level 15,State 1,Procedure proc_1,Line 4 關鍵字'proc'.'附近的語法不正確。 –

+0

@ahmedab​​delqader我提供瞭解決問題的方法,語法錯誤來自查詢。我從OP示例複製。或者可能是因爲我沒有添加ligne feed – Yahfoufi

+1

NOP,它與你的代碼有關,關於'Go','Go'的主要問題應該在分隔線上,在發佈它作爲答案之前執行你的代碼。 –