2016-08-18 30 views
2

すべての値に対してストアドプロシージャをカンマ区切り文字列で実行します。私が('10,20,30 ')を持っているので、spが10回、次に20と30回実行され、1つのテーブルに結果が返されます。 Spは各値に対して1行を返します。 カーソルを使って試してみましたが、正常に機能していません。各値のストアドプロシージャをカンマ区切り文字列で実行します。

SET ANSI_NULLS OFF 
GO 

SET QUOTED_IDENTIFIER OFF 
GO 

ALTER PROCEDURE [dbo].[z_Formulas2] 
(
    @Fund_ID nvarchar,  --('32,25,201') 
    @XFund_ID bigint, 
    @Start_Dated datetime, 
    @End_Dated datetime 
) 
AS 
    DECLARE @FUNDS TABLE(FundId BIGINT) 
    INSERT INTO @FUNDS 
    SELECT item FROM dbo.SplitString(@Fund_ID, ',') --Split string parse csv into table 
    SELECT * FROM @FUNDS 
    DECLARE @MyCursor CURSOR; 
    DECLARE @CurFund BIGINT; 

BEGIN 
SET @MyCursor = CURSOR FOR SELECT FundId FROM @FUNDS 
OPEN @MyCursor 
FETCH NEXT FROM @MyCursor 
INTO @CurFund 

WHILE EXISTS (SELECT FundId FROM @FUNDS) 
BEGIN... --Logic part 
FETCH NEXT FROM @MyCursor 
INTO @CurFund 
END 

CLOSE @MyCursor ; 
DEALLOCATE @MyCursor; 
END 

//dbo.SplitString

ALTER FUNCTION [dbo].[SplitString] 
( 
     @Input NVARCHAR(MAX), 
     @Character CHAR(1) 
) 
RETURNS @Output TABLE (
     Item NVARCHAR(1000) 
) 
AS 
BEGIN 
     DECLARE @StartIndex INT, @EndIndex INT 

     SET @StartIndex = 1 
     IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character 
     BEGIN 
      SET @Input = @Input + @Character 
     END 

     WHILE CHARINDEX(@Character, @Input) > 0 
     BEGIN 
      SET @EndIndex = CHARINDEX(@Character, @Input) 

      INSERT INTO @Output(Item) 
      SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1) 

      SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input)) 
     END 

     RETURN 
END 
+0

'CURSOR'の代わりに、' EXEC'コマンドを使ってメインSP内で2番目のSP(サブSP)を実行してみてください。詳細については、この質問を参照することができます(http://stackoverflow.com/questions/15802511/execute-a-stored-procedure-in-another-stored-procedure-in-sql-server) –

+0

関数の結果に 'NVARCHAR'を使用し、これを' BIGINT'フィールドに挿入しますか? – anatol

+0

なぜあなたはこの点に到達するのですか? SQL Serverには、テーブル値のパラメータなど、複数の値を保持するための*型*が用意されています。すべてを詰め込んで文字列にして、それを解凍するという作業を自分自身に任せてみるのは不思議な選択のようです。 –

答えて

1

それは正しくカーソルで動作していないように見えます。このスニペットで

DECLARE @MyCursor CURSOR; 
DECLARE @CurFund BIGINT; 
BEGIN 
    SET @MyCursor = CURSOR FOR SELECT FundId FROM @FUNDS 
    OPEN @MyCursor 
     FETCH NEXT FROM @MyCursor 
     INTO @CurFund 

     WHILE EXISTS (SELECT FundId FROM @FUNDS) 
     BEGIN 
      --Logic part 
     END 
    CLOSE @MyCursor ; 
    DEALLOCATE @MyCursor; 
END  

WHILEブロックに別のFETCH NEXT演算子をスキップしました。 WHILE EXISTS (SELECT FundId FROM @FUNDS)の代わりにWHILE @@FETCH_STATUS = 0を使用することも正しくなります。これは常にtrueを返すためです。

+0

もう1つFETCH NEXTはまだ存在します。今質問を編集しました。 @@ FETCH_STATUSと一緒に使ってみました – MaazKhan47

+0

'dbo.SplitString()'のコードを表示できますか? – anatol

+0

確かに。 SplitStringが追加されました。しかし、それは正常に動作しています – MaazKhan47

関連する問題