SQL:使用函数从视图中检索CSV

问题描述:

我以this question的答案开始。SQL:使用函数从视图中检索CSV

我决定要从视图中检索信息(用户,每个用户的CSV角色)。该视图不喜欢WITH/FOR XML的语法,因此我决定将该部分放入函数中。

的观点看起来是这样的:

SELECT u.UserId, u.UserName, dbo.GetRolesCsvFromUserId(u.UserId) 
FROM Users u 

我成功达到去除后面的逗号点。这是功能。我如何从这个函数内删除尾部的逗号?

CREATE FUNCTION [dbo].[GetRolesCsvFromUserId] (@UserId int) 
RETURNS nvarchar(100) AS 
BEGIN 
    RETURN 
    (
     SELECT r.RoleName + ',' AS 'data()' 
     FROM Roles r INNER JOIN UsersInRoles ur ON ur.RoleId = r.RoleId 
     WHERE ur.UserId = @UserId FOR XML PATH('') 
    ) 
END 
+0

也许你应该读下一个最大的投票答案这个问题... – 2010-11-25 22:07:04

+0

@OMG小马,我试图让您的解决方案的工作,但没有运气。我不确定问题是什么或如何解决 - 这就是为什么我选择了最高票数的答案。我再次花了最后20分钟试图让它工作,但没有任何运气。 – 2010-11-25 22:27:12

正如@OMG Ponies指出的那样,他的解决方案无需功能即可解决您的问题。不过,如果你需要创建一个函数,你可以不用XML PATH。试试这个:

CREATE FUNCTION [dbo].[GetRolesCsvFromUserId] (@UserId int) 
RETURNS nvarchar(100) AS 
BEGIN 
    DECLARE @Return nvarchar(100) 
    SET @Return = '' 

    SELECT @Return = @Return + r.RoleName + ',' 
    FROM Roles r INNER JOIN UsersInRoles ur ON ur.RoleId = r.RoleId 
    WHERE ur.UserId = @UserId 

    SET @Return = LEFT(@Return,LEN(@Return)-1) 

    RETURN 
    (
     @Return 
    ) 
END