1

這裏是我的方法:調用存儲過程返回值到變量

create procedure sj_busdays_prevmonth @dtStartDate datetime, @dtEnddate datetime--, @busdays_month int output 
as 
return 
SELECT Cast(
    (DATEDIFF(dd, @dtStartDate, @dtEndDate) + 1) 
    -(DATEDIFF(wk, @dtStartDate, @dtEndDate) * 2) 
    -(CASE WHEN DATENAME(dw, @dtStartDate) = 'Sunday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @dtEndDate) = 'Saturday' THEN 1 ELSE 0 END)as int) 

這裏是我的發言:

declare @nBusDays int 
declare @dtStartDate datetime 
declare @dtEndDate datetime 

SET @dtStartDate = cast(CONVERT(VARCHAR(10),DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)),111) as datetime) 
SET @dtEndDate = cast(CONVERT(VARCHAR(10),DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)),111) as datetime) 

exec @nBusDays = sj_busdays_prevmonth @dtStartDate,@dtEndDate 

print @nBusDays 

這裏是我的結果:

0 

它應該是23,這裏發生了什麼?

+1

如果你想要的數據從您應該使用OUTPUT參數,而不是返回值的過程返回。過程的返回值用於指示過程的執行狀態。在你的例子中,我實際上建議將它作爲內聯表值函數而不是過程。它比程序更具靈活性,只要它只是一個這樣的單一語句,它們就超級快。 –

回答

0

變化

return 
SELECT Cast(... 

RETURN Cast(... 

當你需要返回CAST的結果。

(您也可以RETURN (SELECT ...)

0

你需要改變你的存儲過程的代碼,因爲這 -

create procedure sj_busdays_prevmonth @dtStartDate datetime, @dtEnddate datetime--,@busdays_month int output 
as 
SELECT Cast(
    (DATEDIFF(dd, @dtStartDate, @dtEndDate) + 1) 
    -(DATEDIFF(wk, @dtStartDate, @dtEndDate) * 2) 
    -(CASE WHEN DATENAME(dw, @dtStartDate) = 'Sunday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @dtEndDate) = 'Saturday' THEN 1 ELSE 0 END)as int) 

,然後運行您的語句,以獲得期望的結果。 或者你可以改變這樣的代碼太 -

create procedure sj_busdays_prevmonth @dtStartDate datetime, @dtEnddate datetime,@busdays_month int output 
as 
SELECT @busdays_month = Cast(
    (DATEDIFF(dd, @dtStartDate, @dtEndDate) + 1) 
    -(DATEDIFF(wk, @dtStartDate, @dtEndDate) * 2) 
    -(CASE WHEN DATENAME(dw, @dtStartDate) = 'Sunday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @dtEndDate) = 'Saturday' THEN 1 ELSE 0 END)as int) 

,然後調用你的報表 -

declare @nBusDays int 
declare @dtStartDate datetime 
declare @dtEndDate datetime 
SET @dtStartDate = cast(CONVERT(VARCHAR(10),DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)),111) as datetime) 
SET @dtEndDate = cast(CONVERT(VARCHAR(10),DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)),111) as datetime) 
exec sj_busdays_prevmonth @dtStartDate,@dtEndDate,@nBusDays OUT 
print @nBusDays 
相關問題