1

問題が発生しました。CTEコードで複数のデータベースを介してwhileループを使用しようとしています。次のエラーメッセージが表示されます

102, Level 15, State 1, Line 4 Incorrect syntax near ';'.

すべてのクエリに現在使用している現在のコードを以下に貼り付けます...複数のデータベースをループする方法について何か助けがあれば幸いです。ありがとう。

USE WSA
delete from TEST
GO
DECLARE @Database varchar(20), @i int
SELECT @i = 0

WHILE @i < 6     
BEGIN     
if @i = 0 SELECT @Database = 'Hs_Active'     
if @i = 1 SELECT @Database = 'Ge_Active'       
if @i = 2 SELECT @Database = 'At_Active'   
if @i = 3 SELECT @Database = 'LW_Active'     
if @i = 4 SELECT @Database = 'SE_Active'     
if @i = 5 SELECT @Database = 'LL_Active'     

execute(      
'USE '+@Database +'       
 insert into WSA.dbo.TEST      


 ;WITH    
 Credit AS   
 (   SELECT PTNO,CD,AMT,DESCRIPTION,    
 ROW_NUMBER()OVER(PARTITION BY PTNO,CD ORDER BY BatchSeqID) AS Sort    
 FROM dbo.DTLPAYMENTS   
 WHERE AMT < 0 ),    

Debit AS    
(   SELECT PTNO,CD,AMT,DESCRIPTION,    
ROW_NUMBER()OVER(PARTITION BY PTNO,CD ORDER BY BatchSeqID) AS Sort   
FROM dbo.DTLPAYMENTS    
WHERE AMT > 0 )    

SELECT  ISNULL(c.PTNO,d.PTNO) AS PTNO,    
    ISNULL(c.CD,d.CD) AS CD,   
    --Credit data    
    c.AMT AS CRAMT,    
    c.DESCRIPTION AS CRDESCRIPTION,    
    --Debit data     
    d.AMT AS DBTAMT,    
    d.DESCRIPTION AS DBTDESCRIPTION    
 FROM Credit c
 FULL JOIN Debit d 
 ON d.PTNO = c.PTNO
 AND d.CD = c.CD   
 AND d.Sort= c.Sort         


')      
 SELECT @i=@i+1      
  END      
4

1 に答える 1

0

あなたの問題は、CTE定義の前にINSERTを配置することだと思います。次のように移動してみてください:

USE WSA
delete from TEST
GO
DECLARE @Database varchar(20), @i int
SELECT @i = 0

WHILE @i < 6     
BEGIN     
if @i = 0 SELECT @Database = 'Hs_Active'     
if @i = 1 SELECT @Database = 'Ge_Active'       
if @i = 2 SELECT @Database = 'At_Active'   
if @i = 3 SELECT @Database = 'LW_Active'     
if @i = 4 SELECT @Database = 'SE_Active'     
if @i = 5 SELECT @Database = 'LL_Active'     

execute(      
'USE '+@Database +'       
 GO      


 ;WITH    
 Credit AS   
 (   SELECT PTNO,CD,AMT,DESCRIPTION,    
 ROW_NUMBER()OVER(PARTITION BY PTNO,CD ORDER BY BatchSeqID) AS Sort    
 FROM dbo.DTLPAYMENTS   
 WHERE AMT < 0 ),    

Debit AS    
(   SELECT PTNO,CD,AMT,DESCRIPTION,    
ROW_NUMBER()OVER(PARTITION BY PTNO,CD ORDER BY BatchSeqID) AS Sort   
FROM dbo.DTLPAYMENTS    
WHERE AMT > 0 )    
insert into WSA.dbo.TEST
SELECT  ISNULL(c.PTNO,d.PTNO) AS PTNO,    
    ISNULL(c.CD,d.CD) AS CD,   
    --Credit data    
    c.AMT AS CRAMT,    
    c.DESCRIPTION AS CRDESCRIPTION,    
    --Debit data     
    d.AMT AS DBTAMT,    
    d.DESCRIPTION AS DBTDESCRIPTION    
 FROM Credit c
 FULL JOIN Debit d 
 ON d.PTNO = c.PTNO
 AND d.CD = c.CD   
 AND d.Sort= c.Sort         


')      
 SELECT @i=@i+1      
  END    

編集-ああ、USEキーワードでデータベースを切り替えた後、GOが必要です-それも追加しました

于 2013-10-16T13:11:36.857 に答える