web-dev-qa-db-ja.com

ストアドプロシージャにセットとオプションのパラメーターを渡すT-SQL-ASP.NET

私にとって大きな課題です。少し質問があります。皆さんはすでにたくさん助けてくれましたが、次から次へと難しさを増し、信じられないほどゆっくりと進んでいきました。これらの質問は私の仕事をよりよく説明します。

aspxページに次のコントロールがあります:TextBox、CheckBoxList、DropDownList。これらは、検索基準を指定するために使用されます。レコードは、ストアドプロシージャを使用してSQL Server Data Baseから取得されます。

0)TextBoxからテキストを渡して名前で製品を検索する方法は明らかです。ここに質問はありません。

1)CheckBoxListの各CheckBoxには、データベース内の製品グループの実際のIDである値があります。複数のチェックボックスが選択されている場合、IDのリストをセットとしてストアドプロシージャに渡す方法IN @IdList? C#とT-SQLで使用する必要がある変数の型は何ですか?まったく可能ですか?

2)DropDownListの最初の項目は「ALL」です。 「すべて」を選択した場合、ストアドプロシージャに[〜#〜] null [〜#〜]のようなものを渡す必要があります。 [〜#〜] null [〜#〜]の場合、パラメーターを無視するストアドプロシージャを作成する方法

疲れ果てて、アイデアはもう出ません。各基準で個別に検索してから、見つかったIDを個々の配列に入れ、それらを比較して、結果の配列を共通のIDで構成しましたが、多くの問題がありました。巨大な静的配列、非効率的なメモリ使用、動的配列を作成できない、ゼロ以外の要素のみの交差をチェックできないなどを使用するため、その考えを放棄しました...

CREATE PROCEDURE FilterList
    @ProductName nvarchar(200),
    @ProductGroupID int
AS BEGIN 
SELECT 
    prod_id AS 'ID',
    prod_name AS 'Name'
FROM 
    dbo.Products
WHERE 
    prod_group_id = @ProductGroupID OR
    prod_name = @ProductName
END
10
SWA

デフォルト値をNULLにすることで、T-SQLストアドプロシージャのオプションパラメータを実現できます。

「このパラメータを無視する」としてNULLが使用される例:

CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @ProductName nvarchar(200) = null,
    @ProductGroupID int = null
AS BEGIN 

    SELECT
    prod_id AS 'ID',
    prod_name AS 'Name'
    FROM dbo.Products

    WHERE (prod_group_id = @ProductGroupID OR @ProductGroupID IS NULL)
    AND (prod_name = @ProductName OR @ProductName IS NULL)

END

T-SQLでテーブル値パラメーターを受け取るストアドプロシージャを定義することは完全に問題ありません。これは件名に関する記事です http://sqlwithmanoj.wordpress.com/2012/09/10/passing-multipledynamic-values-to-stored-procedures-functions-part4-by-using-tvp/

このグーグルの「テーブル値パラメータ」についてさらに情報が必要な場合

複数値パラメーターの使用例:

CREATE TYPE XTV_ProductNames AS TABLE  --extension, table valued == XTV
( ProductName nvarchar(50))
GO
CREATE TYPE XTV_ProductGroups AS TABLE  --extension, table valued == XTV
( ProductGroupID int))
GO
CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @TVP1 XTV_ProductNames READONLY
    ,@TVP2 XTV_ProductGroups READONLY
AS BEGIN 
    SELECT
    prod_id AS 'ID',
    prod_name AS 'Name'
    FROM dbo.Products as p
    INNER JOIN @TVP1 as s
        ON p.prod_name = s.ProductName
    UNION
    SELECT
    prod_id AS 'ID',
    prod_name AS 'Name'
    FROM dbo.Products as p
    INNER JOIN @TVP2 as s
        ON p.prod_group_id = s.ProductGroupID
END
11

正解はDavidでしたが、NULLと等しいパラメーターではオプションにならないため、少し誤解を招きました。任意の評価期間に設定する必要があります。これにより、オプションのパラメーターも作成されます。

CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @ProductName nvarchar(200) = 'DefaultProduct',
    @ProductGroupID int = 1
AS

したがって、パラメータを渡さずに実行することができます、すなわち:

EXEC [dbo].[dcspFilterEmpList]

これは必ずしもピスコベッツがやろうとしていたことではないことを理解していますが、表示されている実際のトピックの質問とより密接に一致しているようで、重要な違いです。

8
DB505050