0

select ステートメント内で SP の結果を返す方法を知りたいですか? SP に記述した同じコードを使用する必要がある複数のレポートがあり、SP の内容は年に 2 ~ 3 回変更される可能性があります。

select ステートメントは次のようになります。

select Product, Cost, [Output from SP where input is Product Code] from table1

私のストアド プロシージャは、「製品コード」を受け取り、バケット タイプを返すことを意図しています。

ALTER PROCEDURE Product_Bucket_Type (@productcode nvarchar(4)= NULL, @bucket nvarchar(30) OUTPUT)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

Select
    @bucket = Case
    WHEN @productcode IN ('20','22', '26','27','28','2A','2B') THEN 'CA'
    WHEN @productcode IN ('30','32','33','34','35','36','37','38','3A','3B','3C','3R') THEN 'NU' 
    WHEN @productcode IN ('31','43') THEN 'Regulators' 
    WHEN @productcode IN ('40','41','43A','43B','47','48','4A','4B','4F')THEN 'WH'
    WHEN @productcode IN ('50','57','58','5A','5B')THEN 'SN' 
    WHEN @productcode IN ('90','97','98','99','9A','9B','9F') THEN 'QC'
    WHEN @productcode IN ('2J','B01','B02','B03','B04','B05','B06','B07','B08','B09','B10','B11','B12','B13','B14','B15','B16','B17','B23','B24','B25','B28','B29','B30') THEN 'BI' 
    WHEN @productcode IN ('2R','2S','2W','B00','2SA','2SB','2SC','2SD','2SE','2SF','2SG','2SH','2SI','2SJ','2SK','2SL','2SM','2SN','2SO','2SP','2SQ','2SR','2SS','2ST','2SU','2SV','2H','2HA','2T','2TA','2TB','24C','2M') THEN 'TU' 
    WHEN @productcode IN ('21','23','2G','2F','21A') THEN 'GA' 
    WHEN @productcode IN ('2XA','2XB','2XC','2XD','2XE','2XF','2XG','2XH','2XI','2XJ','2XK','2XL','2XM','2XN','2XO','2XP','2XQ','Y0') THEN 'OU' 
    WHEN @productcode IN ('Y7') THEN 'NC'       
    WHEN @productcode IN ('Y8') THEN 'CH' 
    WHEN @productcode IN ('Y9') THEN 'CU' 
    WHEN @productcode IN ('Y1') THEN 'OU'    
    WHEN @productcode IN ('4P') THEN 'PR'
    ELSE 'OTHER'
    END
    if @productcode < '20' SET @bucket = 'SW'
END
GO

私はストアド プロシージャを初めて作成するので、入力と出力の構文が SP で正しいと想定しています。

4

1 に答える 1

1

私の短いコメントをあなたへの適切な回答にします。即時の解決策を提供するために、代わりにストアド プロシージャをスカラー値関数に変更できます。

CREATE FUNCTION [dbo].[Product_Bucket_Type] (
    @productcode nvarchar(4)= NULL
) RETURNS nvarchar(30)
AS BEGIN   
    DECLARE @bucket nvarchar(30)
    Select
         @bucket = Case
         WHEN @productcode IN ('20','22', '26','27','28','2A','2B') THEN 'CA'
         ...
    RETURN @bucket
END

これで、クエリを次のように実行できますSELECT Product, Cost, dbo.Product_Bucket_Type(Product) AS whatever FROM ...

さらに良いことに、ベスとゴードンのアドバイスに従い、クエリを結合する 1 つまたは 2 つのテーブルにコードを分割します。テーブルが現在どのように見えるかについての適切な知識がなければ、それを言うのは少し難しいです-ワイルドな推測として、これ(疑似構造)をまとめます:

表 ProductCodes (ID、ProductCode)
1 '20'
2 '2XA'
3 '2XB'
など

テーブル BucketTypes (id、BucketType)
1 'CA'
2 'OU'

... (1:n、n:1、または n:m 接続によってはわかりにくいため、n:m の場合は次のようなものが必要になる場合があります。

TABLE ProductCodes_Link_BucketType (ProductCodes_ID, BucketTypes_ID)
1 1
2 2
3 2

何があなたの要件に合うかわからないので、そのままにしておきます。それが役に立てば幸い。

于 2013-02-05T13:59:51.480 に答える