sql >> データベース >  >> RDS >> Sqlserver

区切られた文字列をストアド プロシージャに渡してデータベースを検索する

    テーブル パラメーターは使用できないため (SQL Server 2008 では使用できません)、CSV 文字列を渡して、ストアド プロシージャで行に分割してみてください。

    SQL Server で文字列を分割する方法は多数あります。この記事では、ほぼすべての方法の長所と短所について説明します。

    "SQL Server 2005 以降の配列とリスト、テーブル値パラメーターが使用できない場合カットしてください」アーランド・ソマースコグ

    分割関数を作成する必要があります。これは分割機能の使用方法です:

    SELECT
        *
        FROM YourTable                               y
        INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
    

    TSQL で文字列を分割する数値テーブル アプローチを好む ただし、SQL Server で文字列を分割する方法は多数あります。それぞれの長所と短所を説明している前のリンクを参照してください。

    Numbers Table メソッドを機能させるには、テーブル Numbers を作成するこの 1 回のテーブル設定を行う必要があります。 1 から 10,000 までの行を含む:

    SELECT TOP 10000 IDENTITY(int,1,1) AS Number
        INTO Numbers
        FROM sys.objects s1
        CROSS JOIN sys.objects s2
    ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
    

    Numbers テーブルが設定されたら、次の分割関数を作成します。

    CREATE FUNCTION [dbo].[FN_ListToTable]
    (
         @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
        ,@List     varchar(8000)--REQUIRED, the list to split apart
    )
    RETURNS TABLE
    AS
    RETURN 
    (   ----------------
        --SINGLE QUERY-- --this will not return empty rows
        ----------------
        SELECT
            ListValue
            FROM (SELECT
                      LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                      FROM (
                               SELECT @SplitOn + @List + @SplitOn AS List2
                           ) AS dt
                          INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                      WHERE SUBSTRING(List2, number, 1) = @SplitOn
                 ) dt2
            WHERE ListValue IS NOT NULL AND ListValue!=''
    );
    GO 
    

    スペースで区切られた文字列を簡単にテーブルに分割して結合したり、必要に応じて使用したりできるようになりました。このコードは、OP の最新の質問の編集に基づいています:

    CREATE TABLE YourTable (PK int, col1 varchar(20), col2 varchar(20), col3 varchar(20))
    --data from question
    INSERT INTO YourTable VALUES (1,'hello xyz','abc is my last name','and i''m a developer')
    INSERT INTO YourTable VALUES (2,'hello xyz',null,'and i''m a developer')
    
    CREATE PROCEDURE YourProcedure
    (
        @keywords   varchar(1000)
    )
    AS
    
    SELECT
        @keywords AS KeyWords,y.* 
        FROM (SELECT
                  t.PK
                  FROM dbo.FN_ListToTable(' ',@keywords) dt
                      INNER JOIN YourTable             t ON  t.col1 LIKE '%'+dt.ListValue+'%' OR t.col2 LIKE '%'+dt.ListValue+'%' OR t.col3 LIKE '%'+dt.ListValue+'%'
                  GROUP BY t.PK
                  HAVING COUNT(t.PK)=(SELECT COUNT(*) AS CountOf FROM dbo.FN_ListToTable(' ',@keywords))
             ) dt
            INNER JOIN YourTable y ON dt.PK=y.PK
    GO
    
    --from question   
    EXEC YourProcedure 'xyz developer'-- returns 2 rows
    EXEC YourProcedure 'xyz abc'-- returns 1 row
    EXEC YourProcedure 'abc developer'-- returns 1 row
    EXEC YourProcedure 'hello'--  returns 2 rows
    EXEC YourProcedure 'hello developer'--  returns 2 rows
    EXEC YourProcedure 'xyz'-- returns 2 rows
    

    出力:

    KeyWords       PK    col1       col2                 col3
    -------------- ----- ---------- -------------------- --------------------
    xyz developer  1     hello xyz  abc is my last name  and i'm a developer
    xyz developer  2     hello xyz  NULL                 and i'm a developer
    
    (2 row(s) affected)
    
    KeyWords       PK    col1       col2                 col3
    -------------- ----- ---------- -------------------- --------------------
    xyz abc        1     hello xyz  abc is my last name  and i'm a developer
    
    (1 row(s) affected)
    
    KeyWords       PK    col1       col2                 col3
    -------------- ----- ---------- -------------------- --------------------
    abc developer  1     hello xyz  abc is my last name  and i'm a developer
    
    (1 row(s) affected)
    
    KeyWords       PK    col1       col2                 col3
    -------------- ----- ---------- -------------------- --------------------
    hello          1     hello xyz  abc is my last name  and i'm a developer
    hello          2     hello xyz  NULL                 and i'm a developer
    
    (2 row(s) affected)
    
    KeyWords        PK    col1       col2                 col3
    --------------- ----- ---------- -------------------- --------------------
    hello developer 1     hello xyz  abc is my last name  and i'm a developer
    hello developer 2     hello xyz  NULL                 and i'm a developer
    
    (2 row(s) affected)
    
    KeyWords       PK    col1       col2                 col3
    -------------- ----- ---------- -------------------- --------------------
    xyz            1     hello xyz  abc is my last name  and i'm a developer
    xyz            2     hello xyz  NULL                 and i'm a developer
    
    (2 row(s) affected)
    


    1. docker.io-アプリケーションとデータベースコンテナ間のDockerリンク

    2. OracleSQLで2つの日付/時刻の差を計算します

    3. Azure仮想マシンでのSQLServer2014の実行

    4. SQLite-JOINステートメント