저는 SQL 2k5 sproc을 가지고 있습니다.Sproc에서 UDF를 여러 번 사용하기
몇 가지 변수와 사용자 권한에 따라 가격을 계산하려면 UDF를 참조해야합니다. 나는 원래 이것을 시도,하지만 난 필드를 참조되지 않았기 때문에 그것이 작동하지 않았다 ...
SELECT dbo.f_GetPrice(model,userid,authType) 'YourPrice', name, description
FROM tblRL_Products
WHERE 'YourPrice' Between @fromPrice AND @toPrice
OR 'YourPrice' IS NULL
그래서 나는 SQL이 SPROC를 실행하면 이 이
, 그것은 을
SELECT dbo.f_GetPrice(model,userid,authType) 'YourPrice', name, description
FROM tblRL_Products
WHERE dbo.f_GetPrice(model,userid,authType) Between @fromPrice AND @toPrice
OR dbo.f_GetPrice(model,userid,authType) IS NULL
실행
이 수정 함수 3X는 각 레코드에 대해 또는 한 번 실행하고 한 행당 다른 두 위치의 값을 사용합니다.
더 효율적인 방법이 있습니까?
편집
이 스칼라 UDF이다. 사용자가 승인 한 유형을 기준으로 가격을 책정해야합니다. 그런 다음 올바른 가격을 정하면 계산을해야합니다. 이것은 모두 권한 테이블에 저장됩니다. 모든 사용자는 각 제품 라인에 대한 권한을가집니다. 따라서 각 라인에 대해 서로 다른 가격 유형과 계산 방식을 사용하여 단일 검색 결과 호출에서 수십 또는 수백 라인을 되 돌릴 수 있습니다.
이전 코드 인 authType을 사용하여 위의 코드에서 더 이상 해당 매개 변수를 사용하지 않습니다. 이에 대한 UDF를 사용해야하는 경우
ALTER function [dbo].[f_GetPrice]
(
@model uniqueidentifier,
@userID uniqueidentifier
)
returns money
as
begin
Declare @yourPrice money
WITH ProductPrice AS(
SELECT (CASE PriceType
WHEN 'msrp' THEN p.price_msrp
WHEN 'jobber' THEN p.price_jobber
WHEN 'warehouse' THEN p.price_warehouse
WHEN 'margin' THEN p.price_margin
WHEN 'mycost' THEN p.price_mycost
WHEN 'customprice1' THEN p.price_custom1
WHEN 'customprice2' THEN p.price_custom2
WHEN 'customprice3' THEN p.price_custom2
ELSE p.price_msrp
END) as YourPrice, aup.calc, aup.amount
FROM products p
JOIN lines l ON l.lineID=l.lineID
JOIN authorizations a ON l.authlineID=a.authlineID
JOIN authorizationusers au ON a.auID=au.auID
JOIN authorizationuserprices aup ON au.aupID=aup.aupID
WHERE [email protected] AND [email protected])
SELECT @yourPrice=(CASE calc
WHEN 'amount' THEN YourPrice+amount
WHEN 'percent' THEN YourPrice+(YourPrice*amount/100)
WHEN 'divide' THEN YourPrice/amount
WHEN 'factore' THEN YourPrice*amount
WHEN 'none' THEN YourPrice
ELSE YourPrice
END) FROM ProductPrice
return @yourPrice
END
는 dbo.f_GetPrice''의 코드를 보여 주시기 바랍니다 그리고 우리는 *** 좋은 – swasheck