我有一個帶有幾個引數的存盤程序 MYTASK1。它被稱為這樣的東西:
EXECUTE MYTASK1 '2021' , '1','1'
如果引數為空,我如何運行存盤程序。我試過了
EXECUTE MYTASK1 '2021' , '' ,''
但它什么也沒做。
我的存盤程序
ALTER PROC MYTASK1 @Year varchar(6) = NULL,
@quarter varchar(6) = NULL,
@month varchar(6) = NULL
AS
BEGIN
SELECT 'Sell Out' AS name,
'Total Sales Amount' AS Description,
'down' AS status,
CAST(SUM(NetValue) AS decimal(9, 2)) AS amount
FROM SalesAndReturns_RPT
GROUP BY YEAR(Call_ActualStartDate),
DATEPART(QUARTER, Call_ActualStartDate),
MONTH(Call_ActualStartDate)
HAVING YEAR(Call_ActualStartDate) = @Year
AND DATEPART(QUARTER, Call_ActualStartDate) = @quarter
AND MONTH(Call_ActualStartDate) = @month;
END;
uj5u.com熱心網友回復:
這是一個猜測,但我認為這是你想要的:
ALTER PROC dbo.MYTASK1 @Year int = NULL, --Makes no sense as a varchar(6)
@Quarter int = NULL, --Makes no sense as a varchar(6)
@Month int = NULL --Makes no sense as a varchar(6)
AS
BEGIN
SELECT 'Sell Out' AS name,
'Total Sales Amount' AS Description,
'down' AS status,
CAST(SUM(NetValue) AS decimal(9, 2)) AS amount
FROM dbo.SalesAndReturns_RPT
WHERE ((Call_ActualStartDate >= DATEFROMPARTS(@Year, 1, 1) AND Call_ActualStartDate < DATEFROMPARTS(@Year 1, 1, 1)) OR @Year IS NULL)
AND (DATEPART(QUARTER, Call_ActualStartDate) = @Quarter OR @Quarter IS NULL)
AND (DATEPART(MONTH,Call_ActualStartDate) = @Month OR @Month IS NULL)
OPTION (RECOMPILE);
END;
但是,我已經為@YearSARGable 制定了條款,但沒有關于如何@month以及@quarter應該如何處理@Year的資訊,NULL那么這可能沒有什么不同,因為這些條款不是 SARGable。我假設如果@Year是NULL但@Month不是,你會想要SUM那個月的所有行,不管它落在哪一年。
如果您確實需要針對此要求的 SARGable 解決方案,則需要實作日歷表。
uj5u.com熱心網友回復:
您正在執行的代碼:使用空字串作為引數EXECUTE MYTASK1 '2021' , '' ,''觸發程序。MYTASK1請注意,空字串與 null 的值是否不同... NULL 缺乏價值,而空字串是完全有效的字串;)
你可以試試
EXECUTE MYTASK1 '2021' , NULL ,NULL
在您的情況下,NULL 是一個默認值,因此您也可以使用:
EXECUTE MYTASK1 '2021'
uj5u.com熱心網友回復:
由于您將 NULL 作為默認值,因此您根本不能提供引數值
EXECUTE MYTASK1 '2021'
是相同的
EXECUTE MYTASK1 '2021', NULL, NULL
您還可以像這樣使用命名引數:
EXECUTE MYTASK1 @quarter='Q1'
但是,根據其他答案和評論,您對存盤程序的內容存在重大問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451035.html
上一篇:sql合并同一張表中的行
下一篇:根據付款次數生成帳單余額
