10

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

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

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

    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

4

2 に答える 2

11

既定値を 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/

「テーブル値パラメーター」についてこの Google に関する詳細情報が必要な場合

多値パラメーターの使用例:

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
于 2013-04-23T13:18:35.750 に答える
8

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

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

したがって、これはパラメーターを渡さずに実行できます。つまり、次のようになります。

EXEC [dbo].[dcspFilterEmpList]

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

于 2014-08-22T21:17:04.227 に答える