2016-07-01 7 views
0

私はSQL Server 2008 R2を実行しています。私は、アドレスの部分を連結し、画面に表示するためにフォーマットされた結果を返すスカラ関数を書いています。しかし、私が返すのは@Address変数です。都市、州、ジップ、国は決して価値に追加されません。これは単純でなければなりません。私は何を間違えているのですか?関数内の変数を連結できません

これは私のスカラー関数である:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
; 

ALTER FUNCTION [dbo].[fnScreenAddress] (@Id INT) 
RETURNS VARCHAR(50) 
WITH EXECUTE AS CALLER 
AS 
BEGIN 
    DECLARE @ScreenAddress VARCHAR(50), -- The return value 
      @Address VARCHAR(64), 
      @UnitNumber VARCHAR(16), 
      @City VARCHAR(50), 
      @State CHAR(2), 
      @PostalCode VARCHAR(16), 
      @CountryCode VARCHAR(16); 

    SELECT 
     @Address = [Address], 
     @UnitNumber = ISNULL([UnitNumber], ''), 
     @City = [City], 
     @State = [State], 
     @PostalCode = [PostalCode], 
     @CountryCode = ISNULL([CountryCode], '') 
    FROM  
     [dbo].[LPAddress] 
    WHERE 
     [ID] = @Id; 

    SET @ScreenAddress = @Address; 

    IF @City <> '' 
    BEGIN 
     SET @ScreenAddress = @ScreenAddress + ', '; 
    END; 

    SET @ScreenAddress = @ScreenAddress + @City; 

    IF @State <> '' 
    BEGIN 
     SET @ScreenAddress = @ScreenAddress + ', '; 
    END; 

    SET @ScreenAddress = @ScreenAddress + @State; 
    SET @ScreenAddress = @ScreenAddress + @PostalCode; 
    SET @ScreenAddress = @ScreenAddress + @CountryCode; 
    SET @ScreenAddress = LTRIM(RTRIM(@ScreenAddress)); 

    RETURN(@ScreenAddress); 
END; 

はそれをテストするために、私は、クエリウィンドウで次のコマンドを入力します。

enter image description here:そして、私はこの結果セットを

select 
    id, address, city, state, postalcode, countrycode, 
    dbo.fnScreenAddress(id) as [ScreenAddress] 
from 
    lpaddress; 

を取得

+0

FYIでは、SSMSのストアドプロシージャをデバッグできます。コードをステップバイステップで実行し、どこが間違っているかを確認することができます。参照:https://technet.microsoft.com/en-us/library/cc646018.aspx – Blorgbeard

+0

'lpaddress.address'は固定長のcharフィールドですか? '@ ScreenAddress'を' MAX'に設定してみてください。 – Malk

+0

@Malk(at)ScreenAddressをVARCHAR(MAX)に変更しました。しかし、ScreenAddressを構築するために使用される各フィールドをトリミングすることで、この問題が解決されました。フィールドはDB内のCHAR(何か)として定義されているので、それが問題の起源だと思います。私はこれを修正するためにDBAを取得しなければなりませんが(これは現実の世界ですが)、その間にこれは機能します。ヒントありがとう! –

答えて

1

はるかに単純なバージョンのようです.....

ALTER FUNCTION [dbo].[fnScreenAddress] 
(
    @Id     INT 
) 
RETURNS VARCHAR(4000) 
WITH EXECUTE AS CALLER 
AS 
BEGIN 
     DECLARE @ScreenAddress VARCHAR(4000); -- The return value 

SELECT @ScreenAddress = 
    STUFF( 
     ISNULL(', ' + NULLIF([Address] , '') , '') 
     + ISNULL(', ' + NULLIF([UnitNumber] , '') , '') 
     + ISNULL(', ' + NULLIF([City]  , '') , '') 
     + ISNULL(', ' + NULLIF([State]  , '') , '') 
     + ISNULL(', ' + NULLIF([PostalCode] , '') , '') 
     + ISNULL(', ' + NULLIF([CountryCode], '') , '') , 1,2,'') 
FROM [dbo].[LPAddress] 
WHERE [ID] = @Id 

     RETURN @ScreenAddress; 
END; 

重要な注意

私はスカラー関数は、パフォーマンスキラーであり、特別にこの特定の場合には機能が多くの行あなたのように何回も呼ばれる、この目的のためにスカラー関数を使用していないだろう選択が戻ります。より良いパフォーマンスを得るには、選択したクエリに関数のコードを追加するだけです。

関連する問題