2016-07-02 8 views
0

関数に渡された日付と組織IDに基づいて、組織に渡された財務年度の数を計算するスカラー関数を作成しようとしています。私はそのIDに基づいて組織を調べ、会計年度が始まると、計算して戻ってくる必要があります。スカラー関数のT-SQL未解決の参照

tblOrganizationsテーブルへの参照は両方ともSQL71005を示しており、SSMSとVSの両方がテーブルの自動補完を表示していても解決されません。

私はSQLの教祖から遠いです。彼らが解決していない理由は何ですか?

CREATE FUNCTION [dbo].[fnGetFinanicalYear] 
    (
     @dateOfInterest datetime, 
     @organizationId bigint 
    ) 
    RETURNS INT 
    AS 
    BEGIN 

     DECLARE @fyBegins datetime, @ret as bigint 
     SELECT TOP 1 @fyBegins = [dbo].[tblOrganizations].[financialYearBegins] WHERE [dbo].[tblOrganizations].[id] = @organizationId; 

     SELECT @ret = (CONVERT(int,CONVERT(char(8),@dateOfInterest,112))-CONVERT(char(8),@fyBegins,112))/10000; 

     RETURN @ret; 
    END 
+0

本当に 'top 1'が必要なようには思えません。あなたが本当に必要としていることを考えれば、「注文する」ことなくそれを使うのは良い考えではありません。 – shawnt00

+0

この場合も起こらないかもしれません。あなたは本当に '20170228 - 20160229'を0年にしたいですか?私が評論家になっている間、 '@ ret'が普通の' int'に収まらない数字を返すことは不可能です。 – shawnt00

答えて

2

テーブルと対話する場合は、from句が必要です。

SELECT TOP 1 
    @fyBegins = financialYearBegins 
FROM 
    tblOrganizations 
WHERE 
    id = @organizationId; 
0

私はT-SQLで前にこの構文を見ていませんでした:

SELECT TOP 1 @fyBegins = [dbo].[tblOrganizations].[financialYearBegins] WHERE [dbo].[tblOrganizations].[id] = @organizationId; 

はこれを試してみてください

SELECT TOP 1 @fyBegins = financialYearBegins FROM dbo.tblOrganizations WHERE id = @organizationId; 

それを修正するには、権限をチェックして、関数を実行している 'ユーザー'がテーブルに対してSELECT権限を持っていることを確認することができます。