视图SQL Server Management Studio中的函数

视图SQL Server Management Studio中的函数,sql,function,views,Sql,Function,Views,嘿,我在尝试创建一个视图时遇到了问题。我正在尝试将一个成员的完整地址与我的成员表的MemberID以及其他表中的一些其他字段关联起来显示,但是FullAddress和MFullAddress都显示为空值,我不确定为什么希望有人能提供帮助。下面是我的观点代码 SELECT dbo.Member.MemberID, dbo.Member.Title + ' ' + dbo.Member.Forename + ' ' + dbo.Member.Surname AS Fullname, d

嘿,我在尝试创建一个视图时遇到了问题。我正在尝试将一个成员的完整地址与我的成员表的MemberID以及其他表中的一些其他字段关联起来显示,但是FullAddress和MFullAddress都显示为空值,我不确定为什么希望有人能提供帮助。下面是我的观点代码

SELECT        dbo.Member.MemberID, dbo.Member.Title + ' ' + dbo.Member.Forename + ' ' + dbo.Member.Surname AS Fullname, dbo.GetMemberFullAddress(dbo.Member.MemberID) AS FullAddress, 
                     dbo.GetMemberFullMailingAddress(dbo.Member.MemberID) AS MFullAddress, dbo.Lookup_ActionType.Description, dbo.Payment.Amount
FROM            dbo.Payment RIGHT OUTER JOIN
                     dbo.Member ON dbo.Payment.PaymentID = dbo.Member.MemberID RIGHT OUTER JOIN
                     dbo.Action LEFT OUTER JOIN
                     dbo.Lookup_ActionType ON dbo.Action.ActionTypeID = dbo.Lookup_ActionType.ActionTypeID ON dbo.Member.MemberID = dbo.Action.MemberID
WHERE        (dbo.Member.MemberID = dbo.Member.MemberID)
这里是我的两个函数dbo.GetFullMemberAddress。Mfulladdress函数是相同的,只是不同的字段

    USE [ICOM.Database]
    GO
    /****** Object:  UserDefinedFunction [dbo].[GetMemberFullAddress]    Script Date: 22/10/2014     11:53:38 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

-- =============================================
-- Author:      <Richard Glass>
-- Create date: <22/10/2014>
-- Description: <Returns Full Address>
-- =============================================

ALTER FUNCTION [dbo].[GetMemberFullAddress] 
    -- Add the parameters for the function here
    (@MemberID as integer)
RETURNS varchar(250) 
AS
BEGIN
DECLARE @AddressLine as varchar(40)
DECLARE @FullAddress as varchar(250)
SET @FullAddress = (SELECT LTRIM(ISNULL(Title + ' ', '') + ForeName + ' ' + Surname) AS FullName FROM Member WHERE MemberID = @MemberID) + CHAR(10)

SET @FullAddress = @FullAddress + @AddressLine + CHAR(10)
SET @AddressLine = (SELECT Member.AddressLine1 FROM Member WHERE MemberID = @MemberID)
SET @FullAddress = @FullAddress + @AddressLine + CHAR(10)
        SET @AddressLine = (SELECT AddressLine2 FROM Member WHERE MemberID = @MemberID)
IF @AddressLine <> ''
    BEGIN
        SET @FullAddress = @FullAddress + @AddressLine + CHAR(10)
    END
        SET @AddressLine = (SELECT AddressLine3 FROM Member WHERE MemberID = @MemberID)
IF @AddressLine <> ''
    BEGIN
        SET @FullAddress = @FullAddress + @AddressLine + CHAR(10)
    END
SET @AddressLine = (SELECT Town FROM Member WHERE MemberID = @MemberID)
IF @AddressLine <> ''
    BEGIN
        SET @FullAddress = @FullAddress + @AddressLine + CHAR(10)
    END
SET @AddressLine = (SELECT PostCode FROM Member WHERE MemberID = @MemberID)
SET @FullAddress = @FullAddress + @AddressLine

RETURN @FullAddress
END

如果代码就是这样,您的存储过程会更好吗

DECLARE @FullAddress as varchar(250)

SELECT  FullAddress = LTRIM(ISNULL(Title + ' ', '') + ForeName + ' ' + Surname)
        + CHAR(10)
        + ISNULL(Member.AddressLine1 + CHAR(10),'')
        + ISNULL(Member.AddressLine2 + CHAR(10),'')
        + ISNULL(Member.AddressLine3 + CHAR(10),'')
        + ISNULL(Member.Town + CHAR(10),'')
        + ISNULL(Member.PostCode + CHAR(10),'')
FROM Member
WHERE MemberID = @MemberID

RETURN @FullAddress

问题在于,将NULL与任何内容关联在一起,默认情况下会生成NULL。在功能开始时,您有:

DECLARE @AddressLine as varchar(40)
DECLARE @FullAddress as varchar(250)
SET @FullAddress = (SELECT LTRIM(ISNULL(Title + ' ', '') + ForeName + ' ' + Surname) AS FullName FROM Member WHERE MemberID = @MemberID) + CHAR(10)

SET @FullAddress = @FullAddress + @AddressLine + CHAR(10)
问题是:

SET @FullAddress = @FullAddress + @AddressLine + CHAR(10)
此时@AddressLine为NULL,因此您将@FullAddress设置为NULL

您可以通过一种不太复杂的方式获得您的完整地址,例如:

(LTRIM(ISNULL(Title + ' ', '') + ForeName + ' ' + Surname) + ',' + 
CASE WHEN ISNULL(AddressLine1, '') = '' THEN '' ELSE AddressLine1 + ',' END  + 
CASE WHEN ISNULL(AddressLine2, '') = '' THEN '' ELSE AddressLine2 + ',' END  + 
CASE WHEN ISNULL(AddressLine3, '') = '' THEN '' ELSE AddressLine3 + ',' END  + 
CASE WHEN ISNULL(Town, '') = '' THEN '' ELSE Town + ',' END +
CASE WHEN ISNULL(PostCode, '') = '' THEN '' ELSE PostCode END
ALTER TABLE dbo.Member
ADD MemberAddress AS 
    (LTRIM(ISNULL(Title + ' ', '') + ForeName + ' ' + Surname) + ',' + 
    CASE WHEN ISNULL(AddressLine1, '') = '' THEN '' ELSE AddressLine1 + ',' END  + 
    CASE WHEN ISNULL(AddressLine2, '') = '' THEN '' ELSE AddressLine2 + ',' END  + 
    CASE WHEN ISNULL(AddressLine3, '') = '' THEN '' ELSE AddressLine3 + ',' END  + 
    CASE WHEN ISNULL(Town, '') = '' THEN '' ELSE Town + ',' END +
    CASE WHEN ISNULL(PostCode, '') = '' THEN '' ELSE PostCode END;
尽管看起来相当冗长,但它不需要重复查询成员表。然后,您可以将其作为计算列添加:

我倾向于将MemberAddress添加到dbo.Member中,例如:

(LTRIM(ISNULL(Title + ' ', '') + ForeName + ' ' + Surname) + ',' + 
CASE WHEN ISNULL(AddressLine1, '') = '' THEN '' ELSE AddressLine1 + ',' END  + 
CASE WHEN ISNULL(AddressLine2, '') = '' THEN '' ELSE AddressLine2 + ',' END  + 
CASE WHEN ISNULL(AddressLine3, '') = '' THEN '' ELSE AddressLine3 + ',' END  + 
CASE WHEN ISNULL(Town, '') = '' THEN '' ELSE Town + ',' END +
CASE WHEN ISNULL(PostCode, '') = '' THEN '' ELSE PostCode END
ALTER TABLE dbo.Member
ADD MemberAddress AS 
    (LTRIM(ISNULL(Title + ' ', '') + ForeName + ' ' + Surname) + ',' + 
    CASE WHEN ISNULL(AddressLine1, '') = '' THEN '' ELSE AddressLine1 + ',' END  + 
    CASE WHEN ISNULL(AddressLine2, '') = '' THEN '' ELSE AddressLine2 + ',' END  + 
    CASE WHEN ISNULL(AddressLine3, '') = '' THEN '' ELSE AddressLine3 + ',' END  + 
    CASE WHEN ISNULL(Town, '') = '' THEN '' ELSE Town + ',' END +
    CASE WHEN ISNULL(PostCode, '') = '' THEN '' ELSE PostCode END;

是的,干杯,伙计们,我刚刚发现htis自己也设置了FullAddress=FullAddress+AddressLine+CHAR10,在设置任何值之前,它会取这些值?计算列。。。美好的