2013-06-26 32 views
0

聲明我需要基於一個XML變量來執行長動態查詢字符串,然後我需要分割在多個varchar變量字符串,每一個包含在一個更新的一部分遊標內的表。執行多個查詢字符串在第一個

我將發佈查詢的一部分:

DECLARE @QUERY1 VARCHAR(8000); 
DECLARE @QUERY2 VARCHAR(8000); 
DECLARE @QUERY3 VARCHAR(8000); 
DECLARE @QUERY4 VARCHAR(8000); 

DECLARE @cols AS VARCHAR(8000); 

DECLARE @begin INT 
DECLARE @totalid INT 
DECLARE @groupsize INT 
SET @groupsize = 0 
SELECT @totalid = MAX(IntegrationId) FROM Integration 
set @QUERY1 = N' 
BEGIN TRANSACTION 
DECLARE @xml XML 
DECLARE @XMLReceiverID int 
DECLARE XMLRowItem CURSOR FOR 
SELECT XMLReceiverID,XMLContent FROM XMLReceiver WHERE FlagImportData = 0 and Typology = ''XXXX'' 
OPEN XMLRowItem 
FETCH XMLRowItem INTO @XMLReceiverID,@xml 
WHILE @@Fetch_Status = 0 

BEGIN 
'; 
set @QUERY2 = N' 
INSERT INTO IntegrationData (XmlReceiverID) 
'; 
set @QUERY3 = N' 
SELECT @XMLReceiverID 
';  
--PRINT @QUERY1 + @QUERY2 + @QUERY3 
EXEC (@QUERY1 + @QUERY2 + @QUERY3)  
WHILE @groupsize <= @totalid 
BEGIN 
SET @begin = @groupsize 
SET @groupsize = @groupsize + 10 
select @cols = 
(select STUFF((SELECT distinct ',', QUOTENAME(FieldName), ' = ' , CASE WHEN XMLPath IS NULL THEN 'NULL' ELSE '(SELECT TOP 1 c.value(''(' + (REVERSE(LEFT(REVERSE(XMLPath), CHARINDEX('/', REVERSE(XMLPath)) - 1))) + ')[1]'',''VARCHAR(50)'') FROM @xml.nodes(''' + REPLACE(XMLPath,'/' + REVERSE(LEFT(REVERSE(XMLPath), CHARINDEX('/', REVERSE(XMLPath)) - 1)), '') + ''') t(c)) ' END 
from IntegracaoOpcaoLayout 
where FlagIntegration = 1 
AND XMLPath IS NOT NULL 
AND IntegrationId > @begin 
AND IntegrationId <= @groupsize 
order by QUOTENAME(FieldName) asc 

FOR XML PATH(''), TYPE 
).value('.', 'NVARCHAR(MAX)') ,1,1,'')) 

set @QUERY2 = N' 
UPDATE IntegrationData SET ' + @cols + ' WHERE XmlReceiverID = @XMLReceiverID 
'; 
EXEC (@QUERY2) 
--PRINT @QUERY2 
END 
set @QUERY4 = N'  
UPDATE XMLReceiver SET FlagIntegration = 1 WHERE XMLReceiverID = @XMLReceiverID AND FlagImportData = 0 
FETCH NEXT FROM XMLRowItem into @XMLReceiverID,@xml 
END 
PRINT @XMLReceiverID 
CLOSE XMLRowItem 

DEALLOCATE XMLRowItem 
COMMIT TRANSACTION 
'; 
EXEC (@QUERY4) 
--PRINT @QUERY4 

如果我運行這段代碼打印查詢字符串並執行所有正常工作!

但是,如果我正常運行,我得到錯誤波紋管(大約也宣佈在第一exec語句聲明的變量):

Msg 102, Level 15, State 1, Line 15 
Incorrect syntax near '@XMLReceiverID'. 
Msg 137, Level 15, State 2, Line 2 
Must declare the scalar variable "@xml". 

有沒有人周圍的工作或建議?

下面是該查詢打印:

BEGIN TRANSACTION 
DECLARE @xml XML 
DECLARE @XMLReceiverID int 
DECLARE XMLRowItem CURSOR FOR 
SELECT XMLReceiverID,XMLContent FROM XMLReceiver WHERE FlagImportData = 0 and Typology = 'XXXX' 
OPEN XMLRowItem 
FETCH XMLRowItem INTO @XMLReceiverID,@xml 
WHILE @@Fetch_Status = 0 

BEGIN 

INSERT INTO IntegrationData (XmlReceiverID) 

SELECT @XMLReceiverID 

UPDATE IntegrationData SET [Field1] = (SELECT TOP 1 c.value('(test1)[1]','VARCHAR(50)') FROM @xml.nodes('/xmlPath/test1') t(c)) , 
[Field2] = (SELECT TOP 1 c.value('(test2)[1]','VARCHAR(50)') FROM @xml.nodes('/xmlPath/test2') t(c)) , 
[Field3] = (SELECT TOP 1 c.value('(test3)[1]','VARCHAR(50)') FROM @xml.nodes('/xmlPath/test3') t(c)) 
UPDATE XMLReceiver SET FlagImportData = 1 WHERE XMLReceiverID = @XMLReceiverID AND FlagImportData = 0 
FETCH NEXT FROM XMLRowItem into @XMLReceiverID,@xml 
END 
PRINT @XMLReceiverID 
CLOSE XMLRowItem 

DEALLOCATE XMLRowItem 
COMMIT 
+0

從打印中獲得什麼輸出? –

+0

我發佈了@ bastos.sergio – raddesso

+0

請發表表格DDL,樣本數據和預期結果,否則我們只能猜測你實際需要什麼。如果你真的覺得你的問題只能通過使用dynamc T-SQL來解決,請閱讀關於這一主題的文章,通過厄蘭Sommarskog寫: http://www.sommarskog.se/dynamic_sql.html ML –

回答

1

你的代碼是引發錯誤的原因是因爲所有的代碼超出範圍。

這是你的問題。

set @QUERY2 = N' 
    UPDATE IntegrationData SET ' + @cols + ' WHERE XmlReceiverID = @XMLReceiverID 
    '; 
    EXEC (@QUERY2) 
    --PRINT @QUERY2 
    END 
    set @QUERY4 = N'  
    UPDATE XMLReceiver SET FlagIntegration = 1 WHERE XMLReceiverID = @XMLReceiverID AND FlagImportData = 0 
    FETCH NEXT FROM XMLRowItem into @XMLReceiverID,@xml 
    END 
    PRINT @XMLReceiverID 
    CLOSE XMLRowItem 

    DEALLOCATE XMLRowItem 
    COMMIT TRANSACTION 
    '; 

你可以看到你重新分配@ QUERY2與需要@XMLReceiverID聲明,但變量沒有被宣佈爲新的@ QUERY2分配。 @query 4同樣適用。兩個變量@ XML,@ XMLReceiverId與@ Query1不在同一個範圍內。

從本質上講,你需要的所有語句連接成一個變量或將它們組合成一個單一的執行。

+0

問題是因爲變量的最大大小,我無法連接所有數據。該查詢變得超過8000.我需要一段時間來執行多個更新,因爲完整更新超過8000 – raddesso

+0

您不能將變量更改爲varchar(max)嗎? –

+0

您使用的是哪個版本的SQL Server?你可以使用VARCHAR(MAX)(SQL 2005+)嗎? –