2017-08-03 10 views
1

最初の謝罪 - この件に関しては数多くのスレッドがありますが、私の質問に対する答えは見つけられません。SQLユーザー定義関数内選択 - 再度

私は、2つの日付の間の営業日を解決するためのUDFを持っています。私は、SQL Serverの私は別のテーブルと一緒にselect文でそれを呼び出すようにしようとしています2008年

CREATE FUNCTION dbo.fn_CountWeekDays 
(
    @fromdate Datetime, 
    @todate Datetime 
) 
RETURNS TABLE AS RETURN 
(

SELECT 
    (DATEDIFF(dd, @fromdate, @todate) + 1) 
    -(DATEDIFF(wk, @fromdate, @todate) * 2) 
    -(CASE WHEN DATENAME(dw, @fromdate) = 'Sunday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @todate) = 'Saturday' THEN 1 ELSE 0 END) 
    As NoOfWeekDays 

) 

を使用しています:

はどちらか見つけることができません:

select dbo.fn_CountWeekDays(a.date1,a.date2) as workdays 
from alex_datetest a 

は、しかし、私はエラーを取得しています列 "dbo"またはユーザー定義関数または集約 "dbo.fn_CountWeekDays"、または名前があいまいです。

私はdboを削除します。

'fn_CountWeekDays'は認識された関数名ではありません。

誰も私がこの機能を参照できない理由がありますか?事前に

おかげ

アレックス

+1

あなたの関数はテーブルを返しますが、それはスカラー値を返したかのようにあなたはそれを参照しています。 – TZHX

+0

テーブル値関数を使用しています。使用したいデータ型にRETURNを変更する必要があります。 –

答えて

0

あなたは、テーブル値関数を持っているので、あなたがapplyを使用したい:

select cwd.* 
from alex_datetest a cross apply 
    dbo.fn_CountWeekDays(a.date1,a.date2) cwd 

あなたが列を名前を付けたい場合は、次の

select cwd.workdays 
from alex_datetest a cross apply 
    dbo.fn_CountWeekDays(a.date1,a.date2) cwd(workdays) 
0

テーブルを返すので、クロス適用を使用する必要があるかもしれません私はコメントに入れたよう

Select * from yourtable a 
    cross apply dbo.fn_CountWeekDays(a.date1,a.date2) f 
+0

ありがとうございます - 完全に動作します。私はこれを何時間も困惑させてきた – Alexander

1

、であるためにあなたの機能を変える::低

CREATE FUNCTION dbo.fn_CountWeekDays 
(
    @fromdate Datetime, 
    @todate Datetime 
) 
RETURNS int 
AS 
BEGIN DECLARE @int int 

SET @int = 
    (DATEDIFF(dd, @fromdate, @todate) + 1) 
    -(DATEDIFF(wk, @fromdate, @todate) * 2) 
    -(CASE WHEN DATENAME(dw, @fromdate) = 'Sunday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @todate) = 'Saturday' THEN 1 ELSE 0 END); 

    RETURN @int 
END 
関連する問題