21

我写了以下函数。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create FUNCTION NameFunction
(
    @eid int
)
RETURNS varchar
AS
BEGIN
    Declare @logid varchar(50);
    SELECT @logid = E.LoginId from HumanResources.Employee As E
    where E.BusinessEntityID = @eid

    RETURN  @logid

END
GO

当我执行时,结果显示为a. 但预期的结果是adventure-works\terri0 我在这里犯错的地方。只有第一个字符来了。需要改变什么吗?

4

2 回答 2

27

更改您的RETURN类型以包含长度,此时它仅返回 1 个字符:

RETURNS varchar(100)

完整代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create FUNCTION NameFunction
(
    @eid int
)
RETURNS varchar(100) -- or whatever length you need
AS
BEGIN
    Declare @logid varchar(50);
    SELECT @logid = E.LoginId from HumanResources.Employee As E
    where E.BusinessEntityID = @eid

    RETURN  @logid

END
GO
于 2012-09-25T10:30:01.330 回答
13

RETURNS varchar应该是RETURNS varchar(50)

varchar没有指定长度的被解释为varchar(1)在此上下文中(以及varchar(30)在 a 的上下文中CAST)。

顺便说一句:进行数据访问的标量 UDF 可能会成为性能杀手。您可能需要考虑至少将其重写为内联 TVF,以便优化器有更多选择。

于 2012-09-25T10:29:57.907 回答