我创建了一个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)
并检查每次迭代,正在分配正确的值,但是当我要求它加入它们时,它返回一个空白条目。我怀疑我加入字符串的方法不正确,但无法找到替代方法。
答案 0 :(得分:0)
注意最后一句话的结果。如果一个查找返回NULL
,则结果为NULL
。您还必须初始化变量@UsersDisplay
。 DECLARE @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)
另一种方法是使用ISNULL
或Coalesce
功能
SET @UsersDisplay = Coalesce(@UsersDisplay,'') + ',' +
(SELECT Coalesce(lookup,'')
FROM VW_LOOKUP_SecurityUser
WHERE ID = @UserID)