SQL Server将字符添加到字符串的末尾

时间:2014-12-02 16:40:37

标签: sql-server string function concatenation

我创建了一个SQL Server函数,它接受一个管道的数字序列,使用查找表将数字转换为相应的名称,然后将这些名称连接在一起,用逗号分隔,并返回一个字符串。

该功能正常工作,但它没有将字符串连接在一起。我的代码如下:

CREATE FUNCTION UDF_GetNotifyUsersFromIDString
   (@IDString VARCHAR(MAX))
RETURNS VARCHAR(255)
AS
BEGIN
   DECLARE @UsersDisplay VARCHAR(MAX)

   DECLARE @UserID VARCHAR(255)
   DECLARE @UserDisplay VARCHAR(255)
   DECLARE @DelimPos INT

   DECLARE @WorkingString VARCHAR(MAX)
   SET @WorkingString = @IDString

   WHILE (@WorkingString <> '') 
   BEGIN
        SET @DelimPos = CHARINDEX( '|', @WorkingString)

        IF @DelimPos > 0 
        BEGIN
            SET @UserID = LEFT(@WorkingString, @DelimPos-1)
            SET @WorkingString = RIGHT(@WorkingString, LEN(@WorkingString) - @DelimPos)
        END
        ELSE 
        BEGIN
            SET @UserID = @WorkingString
            SET @WorkingString = ''
        END

        SET @UsersDisplay = @UsersDisplay + ',' + (SELECT lookup FROM VW_LOOKUP_SecurityUser WHERE ID = @UserID)
    END

    RETURN @UsersDisplay
END

并运行它我使用:

PRINT dbo.UDF_GetNotifyUsersFromIDString('1|2|3|2|3|')

如果我执行以下操作:

SET @UsersDisplay = (SELECT lookup FROM VW_LOOKUP_SecurityUser)

并检查每次迭代,正在分配正确的值,但是当我要求它加入它们时,它返回一个空白条目。我怀疑我加入字符串的方法不正确,但无法找到替代方法。

3 个答案:

答案 0 :(得分:0)

注意最后一句话的结果。如果一个查找返回NULL,则结果为NULL。您还必须初始化变量@UsersDisplayDECLARE @UsersDisplay VARCHAR(MAX) = '';

答案 1 :(得分:0)

你可能在该字符串中的某处获得了一个空值,并且它将整个结果归零。在连接中尝试这样的事情:

SET @UsersDisplay = @UsersDisplay + ',' + (SELECT COALESCE(lookup,'') FROM VW_LOOKUP_SecurityUser WHERE ID = @UserID)

答案 2 :(得分:0)

问题是您尚未初始化@UsersDisplay变量,该变量将为NULL默认值。 NULL +任何值为NULL ,因此您无法获得任何结果。

所以你可以做两件事,一件是

初始化变量

如果您使用的是SQL SERVER 2008+,那么

DECLARE @UsersDisplay VARCHAR(MAX)=''

否则

DECLARE @UsersDisplay VARCHAR(MAX)
SET @UsersDisplay=''

SET @UsersDisplay = @UsersDisplay + ','
                    + (SELECT Coalesce(lookup,'')
                       FROM   VW_LOOKUP_SecurityUser
                       WHERE  ID = @UserID) 

另一种方法是使用ISNULLCoalesce功能

SET @UsersDisplay = Coalesce(@UsersDisplay,'') + ',' + 
                    (SELECT Coalesce(lookup,'')
                     FROM   VW_LOOKUP_SecurityUser 
                     WHERE  ID = @UserID)