视图SQL Server Management Studio中的函数
嘿,我在尝试创建一个视图时遇到了问题。我正在尝试将一个成员的完整地址与我的成员表的MemberID以及其他表中的一些其他字段关联起来显示,但是FullAddress和MFullAddress都显示为空值,我不确定为什么希望有人能提供帮助。下面是我的观点代码视图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
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,在设置任何值之前,它会取这些值?计算列。。。美好的