0

=LIKEおよびほとんどの演算子で使用するパラメーターを使用して、SQL Server でストアド プロシージャを簡単に作成できます。でも、使いこなすとなるとIN、よくわからないし、教えてくれるいいサイトもみつかりません。

    CREATE PROCEDURE TEST 
    @Ids --- What type should go here?
    AS BEGIN
        SELECT * FROM TableA WHERE ID IN ( @Ids )
    END

これは可能ですか?

4

3 に答える 3

3

SQL Server 2008 以降では、テーブル値パラメーターを使用できます。

INテーブル型を宣言し、それを句で使用できるストアド プロシージャのパラメーター (読み取り専用) として使用できます。

さまざまなオプションについては、Erland Sommarskog による優れたArrays and Lists in SQL Serverのバージョンに関連する記事を読むことをお勧めします。

于 2013-01-11T14:40:03.600 に答える
1

ここで説明されているように、スキーマ関数に追加する Split 関数を使用して、過去にこれを行いました

次に、次のことができます。

CREATE PROCEDURE TEST 
@Ids --- What type should go here?
AS BEGIN

    SELECT * FROM TableA WHERE ID IN ( dbo.Split(@Ids, ',') )
END

IN 関数は常に結果として値のテーブルを想定していることを覚えておいてください。SQL Server は、文字列がプロシージャに具体的に記述されている限り、このテーブル形式に文字列を変換するのに十分スマートです。

ただし、特定の例の別のオプションは、結合を使用することです。これによりパフォーマンスが向上しますが、多くの場合、必要な実際の例を実際に満たすことはできません。結合バージョンは次のようになります。

SELECT * 
FROM TableA AS ta 
    INNER JOIN dbo.Split(@Ids, ',') AS ids 
        ON ta.Id = ids.items
于 2013-01-11T18:03:42.537 に答える
0

あなたが何を求めていると思うかをあなたが尋ねたら、私は毎日これをします..

WITH myData(FileNames)
AS
(
    SELECT '0608751970%'
    UNION ALL SELECT '1000098846%'
    UNION ALL SELECT '1000101277%'
    UNION ALL SELECT '1000108488%'
)
SELECT DISTINCT f.* 
FROM tblFiles (nolock) f
INNER JOIN myData md 
    ON b.FileNames LIKE md.FileNames

または、別のテーブルに基づいてこれを行う場合:

WITH myData(FileNames)
AS
(
    SELECT RTRIM(FileNames) + '%'
    FROM tblOldFiles
    WHERE Active=1
)
SELECT DISTINCT f.* 
FROM tblFiles (nolock) f
INNER JOIN myData md 
    ON b.FileNames LIKE md.FileNames
于 2013-01-11T17:32:41.673 に答える