2013-10-31 30 views
1

在SQL Server 2012中,我有一個腳本多次調用存儲過程。循環將執行與[ResultHeader]表中的記錄數一樣多的次數。執行內部while循環僅第一次

EXEC [AS400].tp_SelectChildItems @Pgm, @Grp, @Pgmgrpseq, 
         null, null, null, null, null, @ItemSelection, null, 
         null, null, null, null, 

注:此SP有table variable

我有一個逗號分隔SelectedCostPageList的列表。對於此列表中的每個值,循環都會執行一次。

我正在觀察一個奇怪的行爲。當我從腳本調用sp時,只有sp第一次返回正確的記錄。在隨後的調用中,存儲過程沒有返回任何記錄。很奇怪…。當我改變逗號分隔字符串的順序時,只有在第一次迭代時,sp纔會回覆記錄。其他時間沒有記錄。

任何猜測會是什麼原因?

 DECLARE @SelectedCostPageList VARCHAR(MAX) 

     SET @SelectedCostPageList = (SELECT (SELECT CONVERT(VARCHAR(32), A.PGM + '-'+A.GRP+'-'+A.PGMGRPSEQ) + ', ' AS [text()] 
     FROM dbo.[ResultHeader] A 
     WHERE UserId = 'U25703' 
     FOR XML PATH('')) AS CostPages) ResultHeader 

     PRINT @SelectedCostPageList 


     DECLARE @pos INT 
     DECLARE @len INT 
     set @pos = 0 
     set @len = 0 

       DELETE FROM ResultItems 

     WHILE CHARINDEX(',', @SelectedCostPageList, @pos+1)>0 
     BEGIN 

       set @len = CHARINDEX(',', @SelectedCostPageList, @pos+1) - @pos 
       DECLARE @SelectedCostPage VARCHAR(10) 
       set @SelectedCostPage = SUBSTRING(@SelectedCostPageList, @pos, @len) 
       set @pos = CHARINDEX(',', @SelectedCostPageList, @[email protected]) +1 
       PRINT @SelectedCostPage 



       DECLARE @Pgm AS VARCHAR (10); 
       DECLARE @Grp AS VARCHAR (10); 
       DECLARE @Pgmgrpseq AS VARCHAR (10); 



       SELECT @Pgm = (SELECT VALUE 
       FROM [AS400].[tf_SelectSplitString] (@SelectedCostPage, '-') 
       WHERE POSITION = 1); 
       PRINT @Pgm 
       SELECT @Grp = (SELECT VALUE 
       FROM [AS400].[tf_SelectSplitString] (@SelectedCostPage, '-') 
       WHERE POSITION = 2); 
       PRINT @Grp 
       SELECT @Pgmgrpseq = (SELECT VALUE 
       FROM [AS400].[tf_SelectSplitString] (@SelectedCostPage, '-') 
       WHERE POSITION = 3); 
       PRINT @Pgmgrpseq 

       Declare @ItemSelection as varchar(4000) 
       set @ItemSelection ='1116102540,1116102541'; 
       print @ItemSelection 

       print 'HAI' 
       print @Pgmgrpseq 

          EXEC [AS400].tp_SelectChildItems 
          @Pgm, @Grp, @Pgmgrpseq, 
          null, null, null, 
          null, null, @ItemSelection, null, 
          null, null, null, null, 
          null, null, null, 1, 'U25703' 



          END 

          SELECT * FROM ResultItems 
          WHERE UserId = 'U25703' 

回答

2

如果我猜的話,那將是因爲你使用', '(逗號後面有一個空格)作爲列表分隔符,但是代碼只是尋找一個逗號。然後,你可能會在字符串值上有一個前導空間,這可能不會匹配任何需要匹配的內容。

第一個作品,因爲你用一個沒有空格的逗號初始化列表字符串。

也許更重要的是,我發現將東西填充到一個字符串中的方法可以循環使用,我應該說,就是20世紀80年代。你可以使用遊標(不是我最喜歡的方法)或臨時表。當我想在這樣的數據做循環,我有時它們結構如下:

declare @looptable table (rownum int identity(1, 1), . . .); 
insert into @looptable . . .; 
declare @tot int; 
select @tot = count(*) from @looptable; 
declare @i int = 1; 
while (@i <= tot) 
begin 
    -- something here with "where rownum = @i" 
end; 

餡值的想法變成一個字符串只是寫更多的代碼來解析出來好像編程工作的浪費。此外,由於將類型轉換爲字符格式以及for path xml處理字符(例如'<''>')的淫穢方式,這可能會導致問題。

+0

感謝您的建議 - 我會嘗試....還有一個很棒的建議....謝謝 – Lijo