0

レポート デザイナーでレポートを作成しています。データセットは、次のようなクエリを使用します。

SELECT LE.Amount, dbo.fnMoneyToEnglish(LE.Amount)
FROM tblXXX LE
WHERE LE.ID = @ID

UDF fnMoneyToEnglish は、次のような単語を返す必要があります。

30 と 00/100 ドル

代わりにのみを返します

30

これは、UDF が再帰を使用して自分自身を呼び出しているためだと思われます。SQL クエリ ウィンドウで埋め込み SQL を実行すると、UDF は完全な "Thirty and 00/100 Dollars" を返します。問題があるのは Report Designer だけで、"Thirty" だけが返されます。SSRS がデータベースに対して 1 回の呼び出しを行い、UDF が実行されて再帰することを期待していたので、これは奇妙だと思います。

レポート デザイナーは何らかの方法でクエリを分解し、データベースへの呼び出しは 1 回に制限されていますか?

参考までに、UDF は次のとおりです。

ALTER FUNCTION [dbo].[fnMoneyToEnglish](@Money AS Money) 

RETURNS VARCHAR(1024)

AS

BEGIN
 DECLARE @Number as BIGINT
 DECLARE @MinusFlag as Bit

if @Money < 0
 begin
 set @Money = -1 * @Money
 Set @MinusFlag = 1
 end

SET @Number = FLOOR(@Money)

DECLARE @Below20 TABLE (ID int identity(0,1), Word varchar(32))

DECLARE @Below100 TABLE (ID int identity(2,1), Word varchar(32))

INSERT into @Below20 (Word) VALUES ( 'Zero')
 INSERT into @Below20 (Word) VALUES ('One')
 INSERT into @Below20 (Word) VALUES ('Two')
 INSERT into @Below20 (Word) VALUES ('Three')
 INSERT into @Below20 (Word) VALUES ('Four')
 INSERT into @Below20 (Word) VALUES ('Five')
 INSERT into @Below20 (Word) VALUES ('Six')
 INSERT into @Below20 (Word) VALUES ('Seven')
 INSERT into @Below20 (Word) VALUES ('Eight')
 INSERT into @Below20 (Word) VALUES ('Nine')
 INSERT into @Below20 (Word) VALUES ('Ten')
 INSERT into @Below20 (Word) VALUES ('Eleven')
 INSERT into @Below20 (Word) VALUES ('Twelve')
 INSERT into @Below20 (Word) VALUES ('Thirteen')
 INSERT into @Below20 (Word) VALUES ('Fourteen')
 INSERT into @Below20 (Word) VALUES ('Fifteen')
 INSERT into @Below20 (Word) VALUES ('Sixteen')
 INSERT into @Below20 (Word) VALUES ('Seventeen')
 INSERT into @Below20 (Word) VALUES ('Eighteen')
 INSERT into @Below20 (Word) VALUES ('Nineteen') 

INSERT into @Below100 (Word) VALUES ('Twenty')
 INSERT into @Below100 (Word) VALUES ('Thirty')
 INSERT into @Below100 (Word) VALUES ('Forty')
 INSERT into @Below100 (Word) VALUES ('Fifty')
 INSERT into @Below100 (Word) VALUES ('Sixty')
 INSERT into @Below100 (Word) VALUES ('Seventy')
 INSERT into @Below100 (Word) VALUES ('Eighty')
 INSERT into @Below100 (Word) VALUES ('Ninety') 

DECLARE @English varchar(1024)
 (
 SELECT @English =
 Case 

WHEN @Number = 0 THEN ''

WHEN @Number BETWEEN 1 AND 19 

THEN (SELECT Word FROM @Below20 WHERE ID=@Number)

WHEN @Number BETWEEN 20 AND 99

-- SQL Server recursive function 

THEN (SELECT Word FROM @Below100 WHERE ID=@Number/10)+ '-' +

dbo.fnMoneyToEnglish( @Number % 10) 

WHEN @Number BETWEEN 100 AND 999 

THEN (dbo.fnMoneyToEnglish( @Number / 100))+' Hundred '+

dbo.fnMoneyToEnglish( @Number % 100) 

WHEN @Number BETWEEN 1000 AND 999999 

THEN (dbo.fnMoneyToEnglish( @Number / 1000))+' Thousand '+

dbo.fnMoneyToEnglish( @Number % 1000) 

WHEN @Number BETWEEN 1000000 AND 999999999 

THEN (dbo.fnMoneyToEnglish( @Number / 1000000))+' Million '+

dbo.fnMoneyToEnglish( @Number % 1000000) 

WHEN @Number BETWEEN 1000000000 AND 999999999999 

THEN (dbo.fnMoneyToEnglish( @Number / 1000000000))+' Billion '+

dbo.fnMoneyToEnglish( @Number % 1000000000) 

ELSE ' INVALID INPUT' END

)

SELECT @English = RTRIM(@English)

SELECT @English = RTRIM(LEFT(@English,len(@English)-1))

WHERE RIGHT(@English,1)='-'

IF @@NestLevel = 1

BEGIN

SELECT @English = @English+' and '
SELECT @English = @English+
    convert(varchar, RIGHT('00'+ convert(varchar, convert(int,100*(@Money - @Number))),2)) +'/100 Dollars'
 if (@MinusFlag = 1)
 begin
 set @English = '( ' + @English + ' )'
 end

END

RETURN (@English)

END 
4

0 に答える 0