Sql server T-SQL用逗号连接VarChar

Sql server T-SQL用逗号连接VarChar,sql-server,tsql,concatenation,Sql Server,Tsql,Concatenation,我是SQL新手。我有这个可以工作的SQL函数,但是我想用一个逗号连接结果,如果结果为空,就不会留下多余的逗号。我和COALESCE玩过一个游戏,但没能成功。任何线索或帮助都会很好 在Python中,我会这样做: 'abcdef'.join(', ') 下面是SQL函数: USE [Broadcast] GO /****** Object: UserDefinedFunction [dbo].[MapConsumerAdvice] Script Date: 04/24/2013 14:4

我是SQL新手。我有这个可以工作的SQL函数,但是我想用一个逗号连接结果,如果结果为空,就不会留下多余的逗号。我和COALESCE玩过一个游戏,但没能成功。任何线索或帮助都会很好

在Python中,我会这样做:

'abcdef'.join(', ')
下面是SQL函数:

USE [Broadcast]
GO
/****** Object:  UserDefinedFunction [dbo].[MapConsumerAdvice]    Script Date: 04/24/2013 14:49:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
ALTER FUNCTION [dbo].[MapConsumerAdvice] 
(
    @A as Int,
    @B as Int,
    @C as Int,
    @D as Int,
    @E as Int,
    @F as Int,
    @G as Int,
    @H as Int
)
RETURNS VarChar(20)
AS
BEGIN

    DECLARE @Result as VarChar(999)

    SET @Result = ''

    IF (@A > 0) SET @Result = @Result + ',' + 'a'
    IF (@B > 0) SET @Result = @Result + ',' + 'd'
    IF (@C > 0) SET @Result = @Result + ',' + 'h'
    IF (@D > 0) SET @Result = @Result + ',' + 'l'
    IF (@E > 0) SET @Result = @Result + ',' + 'm'
    IF (@F > 0) SET @Result = @Result + ',' + 'n'
    IF (@G > 0) SET @Result = @Result + ',' + 's'
    IF (@H > 0) SET @Result = @Result + ',' + 'v'

    Return @Result

END
使用[广播]
去
/******对象:UserDefinedFunction[dbo].[MapConsumerDevice]脚本日期:04/24/2013 14:49:10******/
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
-- =============================================
--作者:
--创建日期:
--说明:
-- =============================================
ALTER函数[dbo].[MapConsumerDevice]
(
@A作为Int,
@B作为Int,
@C作为Int,
@D作为Int,
@E作为Int,
@F作为Int,
@G作为Int,
@H as Int
)
返回VarChar(20)
作为
开始
将@Result声明为VarChar(999)
设置@Result=''
如果(@A>0)设置@Result=@Result+,“+”A”
如果(@B>0)设置@Result=@Result+','+'d'
如果(@C>0)设置@Result=@Result+','+'h'
如果(@D>0)设置@Result=@Result+','+'l'
如果(@E>0)设置@Result=@Result+','+'m'
如果(@F>0)设置@Result=@Result+','+'n'
如果(@G>0)设置@Result=@Result+,“+”s”
如果(@H>0)设置@Result=@Result+','+'v'
返回@Result
结束

在函数末尾添加以下代码

RETURN REPLACE(@result,',,',',')
试一试


您需要检查是否分配了任何内容,而不是
Return@Result

USE [Broadcast]
GO
/****** Object:  UserDefinedFunction [dbo].[MapConsumerAdvice]    Script Date: 04/24/2013 14:49:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
ALTER FUNCTION [dbo].[MapConsumerAdvice] 
(
    @A as Int,
    @B as Int,
    @C as Int,
    @D as Int,
    @E as Int,
    @F as Int,
    @G as Int,
    @H as Int
)
RETURNS VarChar(20)
AS
BEGIN

DECLARE @Result as VarChar(999)

SET @Result = ''

IF (@A > 0) SET @Result = @Result + ',' + 'a'
IF (@B > 0) SET @Result = @Result + ',' + 'd'
IF (@C > 0) SET @Result = @Result + ',' + 'h'
IF (@D > 0) SET @Result = @Result + ',' + 'l'
IF (@E > 0) SET @Result = @Result + ',' + 'm'
IF (@F > 0) SET @Result = @Result + ',' + 'n'
IF (@G > 0) SET @Result = @Result + ',' + 's'
IF (@H > 0) SET @Result = @Result + ',' + 'v'

IF PATINDEX(',%', @Result) > 1 Set @Result = SUBSTRING(@Result, 2, LEN(@Result));

Return @Result

END
使用[广播]
去
/******对象:UserDefinedFunction[dbo].[MapConsumerDevice]脚本日期:04/24/2013 14:49:10******/
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
-- =============================================
--作者:
--创建日期:
--说明:
-- =============================================
ALTER函数[dbo].[MapConsumerDevice]
(
@A作为Int,
@B作为Int,
@C作为Int,
@D作为Int,
@E作为Int,
@F作为Int,
@G作为Int,
@H as Int
)
返回VarChar(20)
作为
开始
将@Result声明为VarChar(999)
设置@Result=''
如果(@A>0)设置@Result=@Result+,“+”A”
如果(@B>0)设置@Result=@Result+','+'d'
如果(@C>0)设置@Result=@Result+','+'h'
如果(@D>0)设置@Result=@Result+','+'l'
如果(@E>0)设置@Result=@Result+','+'m'
如果(@F>0)设置@Result=@Result+','+'n'
如果(@G>0)设置@Result=@Result+,“+”s”
如果(@H>0)设置@Result=@Result+','+'v'
如果PATINDEX(“,%”,@Result)>1设置@Result=SUBSTRING(@Result,2,LEN(@Result));
返回@Result
结束

这应该标记为SQL Server。请添加此标记(如果使用不同的RDBMS,请添加其他标记)。此外,我强烈建议不要这样做。SQL Server的数据类型非常适合存储多个值。这叫桌子。如果使用提供的类型,您会发现查询更容易编写,也更容易执行。您需要删除结果中的前导逗号?@techdo是的,没错。如果我没有错..我假设函数的任何参数都传递了“”(空白)然后你需要添加上面的代码。因为它可能以,bc,,fNo结尾,所以我标记的解决方案似乎可以在空白处正常工作。谢谢你的建议
RETURN RIGHT(@Result, LEN(@Result)-1)
USE [Broadcast]
GO
/****** Object:  UserDefinedFunction [dbo].[MapConsumerAdvice]    Script Date: 04/24/2013 14:49:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
ALTER FUNCTION [dbo].[MapConsumerAdvice] 
(
    @A as Int,
    @B as Int,
    @C as Int,
    @D as Int,
    @E as Int,
    @F as Int,
    @G as Int,
    @H as Int
)
RETURNS VarChar(20)
AS
BEGIN

DECLARE @Result as VarChar(999)

SET @Result = ''

IF (@A > 0) SET @Result = @Result + ',' + 'a'
IF (@B > 0) SET @Result = @Result + ',' + 'd'
IF (@C > 0) SET @Result = @Result + ',' + 'h'
IF (@D > 0) SET @Result = @Result + ',' + 'l'
IF (@E > 0) SET @Result = @Result + ',' + 'm'
IF (@F > 0) SET @Result = @Result + ',' + 'n'
IF (@G > 0) SET @Result = @Result + ',' + 's'
IF (@H > 0) SET @Result = @Result + ',' + 'v'

IF PATINDEX(',%', @Result) > 1 Set @Result = SUBSTRING(@Result, 2, LEN(@Result));

Return @Result

END