Я не могу получить правильный синтаксис для вызова хранимой процедуры в операторе Select - PullRequest
1 голос
/ 11 апреля 2019

У меня есть простая хранимая процедура, которую я хочу использовать в формуле.

Моя хранимая процедура выглядит следующим образом:

USE [MGCustom]
GO
/****** Object:  StoredProcedure [dbo].[stpGetCogAmt]    Script Date: 4/10/2019 4:55:17 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Mike Ruoppoli
-- Create date: 
-- Description: <Procedure to get the Cogs value based on the month,Values to be included in a table later.>
-- =============================================
ALTER PROCEDURE [dbo].[stpGetCogAmt]
    -- Add the parameters for the stored procedure here
    @ProdMonth int
,   @CogsRate DECIMAL(4,4)  OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

    --@CogsPerLb, @p2
    Set @CogsRate =(CASE @ProdMonth 
            WHEN 1 THEN 0.0957 WHEN 2 THEN 0.0904 WHEN 3 THEN 0.0884 WHEN 4 THEN 0.0906 WHEN 5 THEN 0.0818 WHEN 6 THEN 0.0787 WHEN 7 THEN 0.0777 WHEN 8 THEN 0.0769 WHEN 9 THEN 0.0756 WHEN 10 THEN 0.0778
            WHEN 11 THEN 0.0754 WHEN 12 THEN 0.0787 ELSE .08 END) 

END

Хранимая процедура запускается и возвращает значениекак и ожидалось, но когда я пытаюсь использовать в этом контексте, я получаю неправильный синтаксис рядом с 'EXEC'

больше кода

SELECT dbo.vwUD15.Date01, (EXEC dbo.stpGetCogAmt @ProdMonth = "(LEFT(dbo.vwUD15.Key2, LEN(dbo.vwUD15.Key2) - 5))") AS CogsRate
FROM dbo.vwUD15

Я искал хороший бит и не могу понять, кто яздесь неправильно.

Я буду использовать этот символ в нескольких формулах ...

1 Ответ

1 голос
/ 11 апреля 2019

Один из комментариев в коде указывает на дальний лучший способ моделирования этого:

create table CogRates (
    ProdMonth int not null,
    CogsRate decimal(4,4) not null,
    constraint PK_CogRates PRIMARY KEY (ProdMonth),
    constraint CK_CogRates_Months CHECK (ProdMonth between 1 and 12)
)
go
insert into CogRates (ProdMonth,CogsRate) values
(1 ,0.0957),
(2 ,0.0904),
(3 ,0.0884),
(4 ,0.0906),
(5 ,0.0818),
(6 ,0.0787),
(7 ,0.0777),
(8 ,0.0769),
(9 ,0.0756),
(10,0.0778),
(11,0.0754),
(12,0.0787)
go
SELECT v.Date01, cg.CogsRate AS CogsRate
FROM dbo.vwUD15 v
    inner join
    CogRates cg
        on cg.ProdMonth = LEFT(v.Key2, LEN(v.Key2) - 5)

Не пишите процедурный код, когда код на основе набора сделает работу.

Хранимые процедуры не могут быть объединены в большие запросы.Вы могли бы переместить свою логику в пользовательскую функцию, но когда это просто lookup , это то, что SQL превосходит в .(Хотя было бы предпочтительнее, если бы мы не выполняли манипуляции со значением столбца в правой части этого сравнения)

В общем, если вы планируете написать функцию (не хранимый процесс) иопределение детерминированное , а домен "маленький", рассмотрите возможность использования таблицы.В качестве бонуса вы также можете бесплатно получить обратную функцию, если вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...