0

正しい 5 つの結果を返すクエリがあります。私は今、それをストアドプロシージャに書き直そうとしています。

元のクエリ:

    SELECT something  FROM myTable  where
   ORG + '-' + ORGSUB like '2342342-________' or
    ORG + '-' + ORGSUB like '5435354-________' or 
    ORG + '-' + ORGSUB like '_______-________'

しかし、カンマ区切りのリストとして渡したいORGので、次のようになります。

 SELECT ORG + '-' + ORGSUB   FROM myTable  where
   ORG + '-' + ORGSUB in('2342342-________','5435354-________' ,'_______-________')

しかし、私はここで0の結果を得ています。

また、次のように Split 関数を使用してみました。

ALTER FUNCTION [dbo].[udf_Split]
(
   @psCSString VARCHAR(max)
)
RETURNS @otTemp TABLE(sID VARCHAR(50))
AS
BEGIN
 DECLARE @sTemp VARCHAR(50)

 WHILE LEN(@psCSString) > 0
 BEGIN
  SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
                    LEN(@psCSString)))
  SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
                               LEN(@psCSString)) + 1, LEN(@psCSString))
  INSERT INTO @otTemp VALUES (@sTemp)
 END

RETURN
END

ストアド プロシージャを作成し、すべての変数を一番上に宣言する

SELECT something
FROM myTable 
where ORG + '-' + ORGSUB  in (select * from udf_Split(@orgList) as Split)

しかし、これも私に大きな脂肪0を与えます。

4

2 に答える 2

1

これが実際の質問に答えないことは知っていますが、これを処理するために私が見たすべてのソリューションは、プロシージャに複数の値を渡すことができないという以前の制限を回避するための汚いハックのように感じます。sql-server 2008にテーブル値パラメーターが導入されて以来、SQL内で区切り文字列が必要になる理由がわかりません。

最初のステップは、値を含むタイプを作成することです(私は、再利用できるように一般的な名前を使用する傾向があります)。

CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));

次に、プロシージャを作成します。

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);

GO

次に、次のようにプロシージャを呼び出すことができます

DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES 
    ('2342342', '________', 'A'),
    ('5435354', '________', 'B');

EXECUTE dbo.GetFromTable @OrgList;

SQLフィドル

これにより、より適切なテーブルを作成する機会さえ得られます。

CREATE TYPE dbo.OrgList AS TABLE(Org VARCHAR(10), OrgSub VARCHAR(10));

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.OrgList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   EXISTS
            (   SELECT  1
                FROM    @OrgList O
                WHERE   MyTable.Org = o.Org
                AND     MyTable.OrgSub = o.OrgSub
            );

GO

次に実行します

DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES 
    ('2342342', '________'),
    ('5435354', '________');

EXECUTE dbo.GetFromTable @OrgList;

SQLフィドル

カンマ区切りのリストを渡す必要がある場合は、XML変換を使用してStringListタイプに変換し、同じ手順を使用できますが、テーブル値パラメーターを使用すると、区切り文字列を使用するよりもはるかに柔軟性があります。

DECLARE @S VARCHAR(MAX) = '2342342-________,5435354-________,_______-________';

DECLARE @OrgList dbo.StringList;
INSERT @OrgList
SELECT  Y.value('.', 'NVARCHAR(MAX)')
FROM    (SELECT [X] = CAST(('<X>' + REPLACE(@S, ',' ,'</X><X>')+'</X>') AS XML)) X
        CROSS APPLY X.nodes('X') AS y (Y)

EXECUTE GetFromTable @OrgList

SQLフィドル

于 2013-01-28T18:09:00.047 に答える
0

charindex()またはを使用like:

where ','+'2342342-________','5435354-________' ,'_______-________'+',' like '%,' + ORG + '-' + ORGSUB + ',%'

引数にスペースがある場合は、次のようになります。

where ','+replace(@orglist, ' ', '')+',' like '%,'+ORG+'-'+ORGSUB+',%'
于 2013-01-28T17:11:58.497 に答える