1

SQL Server 2012 で、ストアド プロシージャを複数回呼び出すスクリプトがあります。 [ResultHeader] テーブルのレコード数だけループが実行されます。

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

注: この SP にはtable variable内部があります。

SelectedCostPageList のカンマ区切りのリストがあります。このリストの値ごとに、ループが 1 回実行されます。

私は奇妙な行動を観察しています。スクリプトから 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, @pos+@len) +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'
4

1 に答える 1

2

私が推測しなければならなかった', 'のは、リスト区切り文字として (カンマの後にスペースが続く) を使用しているからでしょうが、コードはコンマを探しているだけです。その場合、文字列値の先頭にスペースがあり、おそらく一致する必要があるものと一致しません。

スペースなしのカンマでリスト文字列を初期化するため、最初の方法が機能します。

おそらくもっと重要なことは、物事を文字列に詰め込んでループするというアプローチが、まさに1980年代であると思います. カーソル (私のお気に入りのアプローチではありません) または一時テーブルを使用できます。そのようなデータに対してループを実行したい場合、次のように構造化することがあります。

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ます。'<''>'

于 2013-10-31T21:11:30.503 に答える