获取用户定义函数不期望的空值

时间:2014-02-11 00:55:35

标签: sql-server user-defined-functions

我试图创建一个根据区号显示客户名称的功能。

创建了函数,但是我得到的是已知区域代码的空结果,我应该得到很多。

我是一个无知的新手,这可能是一个因素。

alter function ufnGetCustomerByAreaCode(@AreaCode nvarchar(3))
returns nvarchar(100)
as
begin
declare @Customer as nvarchar(100);
set @Customer =
    (
        select c.FirstName + ' ' + c.LastName
        from SalesLT.Address as a
        join SalesLT.CustomerAddress as ca
        on a.AddressID = ca.AddressID
        join SalesLT.Customer as c
        on ca.CustomerID = c.CustomerID
        where left(a.PostalCode,3) = @AreaCode
    )
    return @Customer
    end

使用命令

选择dbo.ufnGetCustomerByAreaCode(706)

我的结果是空的。该表有很多706区号。

1 个答案:

答案 0 :(得分:1)

您正在过滤PostalCode(a.k.a.邮政编码)的左侧3个字符,我认为您打算使用左侧3个电话号码字符,因为这是您找到区号的地方。

此外,您已创建标量函数,因此在更改为区域代码而不是邮政编码后,如果有多个客户使用706区号,则可能会出现以下错误:

  

“子查询返回的值超过1。当子查询跟随=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。”

如果您想要检索具有特定区号的所有客户,那么您将需要一个表值函数。见http://technet.microsoft.com/en-us/library/ms189294(v=sql.105).aspx

如果您不想返回重复的客户名称,请在函数中的SELECT之后添加DISTINCT。

请注意,从表值函数中选择时,应使用语法

SELECT Customers FROM dbo.ufnGetCustomerByAreaCode('706') 

而不是

SELECT dbo.ufnGetCustomerByAreaCode('706')