返回Address的标量函数

时间:2017-05-06 15:49:48

标签: sql sql-server tsql

我按照建议更新了代码,但现在我收到了一个新错误:

  

Msg 141,Level 15,State 1,Procedure udf_GetCustomerAddress,Line 31
  为变量赋值的SELECT语句不能与数据检索操作结合使用。

我的代码粘贴在下面:

--The function
Create Function udf_GetCustomerAddress
    (@CustomerID varchar)
Returns varchar
As
Begin
    declare @CustomerAddress varchar

    select 
        @CustomerAddress = c.CompanyName, c.Address, c.City, 
        c.StateOrRegion, c.PostalCode, c.CustomerID
    from 
        Customers c
    where 
        c.CustomerID = @CustomerID

    Return @CustomerAddress
End

提前再次感谢!

2 个答案:

答案 0 :(得分:0)

您应该Return varchar更改RETURNS VARCHAR

Go
--Address function
Create Function udf_GetCustomerAddress
(@CustomerID varchar)
RETURNS varchar(max)
As
Begin
    declare @CustomerAddress varchar(max);

    select @CustomerAddress = concat(c.CompanyName, c.Address, c.City, 
    c.StateOrRegion, c.PostalCode, c.CustomerID)
    from Customers c
    where c.CustomerID = @CustomerID;

    Return @CustomerAddress;
End

查看CREATE FUNCTION语法。

答案 1 :(得分:0)

您需要所有varchar()的长度 - 始终在SQL Server中使用长度。然后你可能想要连接结果。如果我假设所有类型都是字符串。 。

Create Function udf_GetCustomerAddress (
    @CustomerID varchar(255)
)
Returns varchar(max)
As
Begin
    declare @CustomerAddress varchar(max);

    select @CustomerAddress = (c.CompanyName + ' ' +
                               c.Address + ' ' +
                               c.City + ' ' + 
                               c.StateOrRegion + ' ' +
                               c.PostalCode + ' ' +
                               c.CustomerID
                              )
    from Customers c
    where c.CustomerID = @CustomerID;

    Return @CustomerAddress;
End;

这假设您确实希望所有字段都带有一些分隔符。

但是,我不认为这是获得所需功能的最佳方式。最好在表中添加一个计算列:

alter table Customers c
    add CustomerAddress as (<expression here>);