2010-11-25 9 views
0

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

を... –

+0

@OMGポニー、私はあなたのソリューションが動作するように取得しようと、ない運。私は問題が何であるか、それを修正する方法がわからないので、最高の投票回答を出したのです。私はもう一度それを稼働しようとしている最後の20分を費やしたが、運がない。 –

答えて

1

@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 
+0

素晴らしい作品 - thx。末尾のカンマを削除する前に長さチェックを追加しました。 –

関連する問題