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

値が null の場合にストアド プロシージャのパラメータを無視する方法

    非常に優れた記事 T‑SQL の動的検索条件 があります。 Erland Sommarskogによる。彼は使用できるいくつかのアプローチを説明し、@lad2025 が提案した動的 SQL の構築と OPTION(RECOMPILE) の使用を比較します。 .

    私は個人的に OPTION(RECOMPILE) を使用しています これらのクエリで。 SQL Server 2008 を使用しているため、このオプションは適切な選択です。動的 SQL ルートを使用する場合は、彼の別の記事 The Curse and Blessings of Dynamic SQL .

    したがって、手順は次のようになります:

    create procedure proc1
        @var1 varchar(100) = null,
        @var2 varchar(100) = null,
        @var3 varchar(100) = null,
        @var4 varchar(100) = null,
        ........   
        @var10 varchar(100) = null
    as
    begin
        insert into #a
        select * from
        (
            select * 
            from
                tab1 as a
                inner join tab2 as b on a.rollnumber = b.rollnumber
                inner join tab3 as c on c.city = b.city
                ........
                inner join tab10 as j on J.id = i.id
            where 
                (a.id = @var1 OR @var1 IS NULL)
                and (b.id = @var2 OR @var2 IS NULL)
                and (c.id = @var3 OR @var3 IS NULL)
                ...........
                and (J.id = @var10 OR @var10 IS NULL)
        ) as abc
        OPTION(RECOMPILE);
    
        if (select count(*) from #a) < 10 
        begin
            select * from #a
        end
        else 
        begin
            print 'Cannot display the records as count is more than 10'
        end
    end
      

    ところで、 count() をチェックして何を達成しようとしているのかは明確ではありません 、しかしおそらく必要なのは単純な TOP(10) だけです 最大 10 行の最初の行を返します。 ORDER BY を必ず追加してください TOP を使用する場合の句 一貫して結果を返します。わからない場合は、プロシージャの別のパラメーターを使用して、返される行の最大数を示し、それを TOP(@ParamMaxRowCount) で使用できます。 .結果セットを返すこともあれば、メッセージを出力することもあるストアド プロシージャを持つことは一般的ではありません。



    1. Apachelibphp5.soの.pgpassを使用する

    2. MySQLiは、SSLを使用する場合、デフォルトでサーバー証明書を検証しますか?

    3. データベースの精度を向上させる方法

    4. フルテキストブール検索でC++という用語を取得するにはどうすればよいですか?