【问题标题】:SQL Server adding characters to the end of a stringSQL Server 在字符串末尾添加字符
【发布时间】:2014-12-02 16:40:36
【问题描述】:

我创建了一个 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)

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

【问题讨论】:

    标签: sql-server string function concatenation


    【解决方案1】:

    问题是你还没有初始化你的@UsersDisplay 变量,默认是NULLNULL + 任何值都是 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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-09-16
          • 1970-01-01
          • 1970-01-01
          • 2020-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 2017-04-10
          相关资源
          最近更新 更多