2011-12-29 14 views
0

私は、ストアドプロシージャGetReportItems持っている:私はのようにそれを渡すことができ分割文字列パラメータで、その文字列を選択しますか?

GetReportItems 

@ItemId varchar(max) 

SELECT rt.ReportName, rt.ReportId, rg.OriginatedFrom 
FROM Reports rt 
    JOIN ReportOrigin rg on rg.ReportId = rt.ReportId 
     WHERE rt.ColA = SUBSTRING(@ItemId, 1, 3) 
     AND rt.ColB = SUBSTRING(@ItemId, 4, Len(@ItemId) - 3) 

@ItemIdを:ABC123Z OR DEF3456Y OR GHI7890Xとすべてが正常に動作します。 @ItemIdとしてABC123Z~DEF3456Y~GHI7890X

  1. パス、ストアドプロシージャへのパラメータ:

    は、しかし、私はできるようにするには、このストアドプロシージャを更新する必要があります。

  2. @ItemId文字列を~に分割し、それぞれの文字列にSELECTをコールするストアドプロシージャ。

上記の1と2をどうすればできますか? 格納されたprocに複数のパラメータを渡しても、どのようにこれらのすべてのパラメータにSELECTを集計できますか?

+1

これは間違った場所から始まっています。アイテムを分割することは十分に悪いことです。分割されるアイテムの可変長リストを処理しようとすると、あまり意味がありません。私は、代替案として何を推薦するか正確にはわかりません。私はおそらく2つの列、ColAの部分とColBの部分の文字列の一時テーブルを使用するだろう。私は検索する値をテーブルにロードしてから、メインテーブルと一時テーブルの結合としてクエリを実行します。 –

答えて

1

温度表はあなたの友人です。 :)あなたの@ItemIDを持って、それを一時テーブルに分割し、レポートをその一時テーブルに結合します。

-- We need some variables for working with the data 
DECLARE @Sep Char, 
      @SepPos Int 
SET @Sep = '~' 

-- We need a place to store our arguments 
CREATE TABLE #Values (Val1 VarChar(3), Val2 VarChar(50)) 

SELECT @SepPos = CharIndex (@Sep, @ItemID) 
WHILE @SepPos > 0 BEGIN 
    -- Parse the leading argument into the temp table 
    INSERT INTO #Values (Val1, Val2) 
    SELECT SubString (@ItemID, 1, 3), 
      SubString (@ItemID, 4, @SepPos - 4) 

    -- Remove the leading argument from the argument string 
    SELECT @ItemID = SubString (@ItemID, @SepPos + 1, Len (@ItemID)) 
    -- Find the next separator 
    SELECT @SepPos = CharIndex (@Sep, @ItemID) 
END 
-- On the last loop, it won't have a separator, so we'll end up with 
-- one last argument to parse into our temp table 
INSERT INTO #Values (Val1, Val2) 
SELECT SubString (@ItemID, 1, 3), 
     SubString (@ItemID, 4, Len (@ItemID) - 3) 

-- Now join to our report 
SELECT * 
FROM  Reports rt 
    JOIN ReportOrigin rg ON rg.ReportId = rt.ReportId 
    JOIN #Values ON 
     rt.ColA = #Values.Val1 AND rt.ColB = #Values.Val2 
関連する問題