如何使用Transact-SQL(t-SQL)删除尾随字符?

如何使用Transact-SQL(t-SQL)删除尾随字符?,sql,sql-server,tsql,delimiter,trailing,Sql,Sql Server,Tsql,Delimiter,Trailing,对于transact-sql t-sql,我有一个字符串常量和三个字符串变量,希望在每个值之间用分号分隔符连接。三个字符串变量中的每一个有时都是空的或null,这会导致出现一个、两个或三个分号分隔符的情况,而我不需要这些分隔符 我尝试了Concat_ws函数,该函数应该根据t-sql网站工作,但我收到一条错误消息,说没有一个可识别的函数名。我用Replace函数尝试了两个语句,其中我用空格替换了两个或三个分号。这很有效,但看起来很粗糙,不能帮助我只替换一个尾随的分号。有什么想法吗 当变量为空时产

对于transact-sql t-sql,我有一个字符串常量和三个字符串变量,希望在每个值之间用分号分隔符连接。三个字符串变量中的每一个有时都是空的或null,这会导致出现一个、两个或三个分号分隔符的情况,而我不需要这些分隔符

我尝试了Concat_ws函数,该函数应该根据t-sql网站工作,但我收到一条错误消息,说没有一个可识别的函数名。我用Replace函数尝试了两个语句,其中我用空格替换了两个或三个分号。这很有效,但看起来很粗糙,不能帮助我只替换一个尾随的分号。有什么想法吗

当变量为空时产生过多分号的示例代码:

Concat('Label ', ';', var1, ';', var2, ';', var3) as Result
下面是一个与SQL Server中的concat_ws等效的示例:

stuff( coalesce(';' + nullif(var1, ''), '') + coalesce(';' + nullif(var2, ''), '') + coalesce(';' + nullif(var3, ''), ''), 1, 1, '') as Result
您可以在此结果前添加“标签”。我不确定您是否真的想在“Label”后面加一个分号,因此在concat_ws中也不合适。

使用:

看。 结果:


为此,只需更改“;”@变量到“;”+@CONCAT语句中的var

DECLARE 
  @var1 VARCHAR(10) = 'abc',
  @var2 VARCHAR(10) = 'xyz',
  @var3 VARCHAR(10) = '123';

SELECT CONCAT('Label ', ';'+@var1, ';'+@var2, ';'+@var3) as Result;
靠着桌子:

DECLARE 
  @v1 VARCHAR(10) = 'abc',
  @v2 VARCHAR(10) = 'xyz',
  @v3 VARCHAR(10) = '123';

DECLARE @table TABLE (var1 VARCHAR(10),var2 VARCHAR(10),var3 VARCHAR(10));
INSERT @table VALUES (@v1,@v2,NULL),(@v1,NULL,NULL),(@v1,NULL,@v3),(NULL,NULL,NULL)

SELECT CONCAT('Label ', ';'+var1, ';'+var2, ';'+var3) as Result
FROM @table;
结果:

要处理空白,请使用NULLIFvar包装变量,。最终解决方案:

DECLARE 
  @v1 VARCHAR(10) = 'abc',
  @v2 VARCHAR(10) = 'xyz',
  @v3 VARCHAR(10) = '123';

DECLARE @table TABLE (var1 VARCHAR(10),var2 VARCHAR(10),var3 VARCHAR(10));
INSERT @table VALUES (@v1,@v2,NULL),(@v1,NULL,NULL),(@v1,NULL,@v3),(NULL,NULL,NULL),
                     (@v1,@v2,''),(@v1,'',''),(@v1,'',@v3),(NULL,'',NULL);

SELECT CONCAT('Label ', ';'+NULLIF(var1,''), ';'+NULLIF(var2,''), ';'+NULLIF(var3,'')) as Result
FROM @table;
结果:


Concat_ws已添加到SQL Server 2017。Concat_ws不适用于我。给出了错误。不确定我使用的是什么版本的t-sql,它是供应商软件的一部分。Concat_WS将跳过空参数,但不会跳过空字符串。可以使用大小写表达式或iif将空字符串替换为null。提示:选择@@Version;将返回SQL Server的版本。请将从“选择@@version”获得的结果添加到问题中。似乎您运行的是2017年之前的版本。我将尝试case表达式或iif。当我运行select@@Version时;错误表示必须删除标量变量@版本。
DECLARE 
  @v1 VARCHAR(10) = 'abc',
  @v2 VARCHAR(10) = 'xyz',
  @v3 VARCHAR(10) = '123';

DECLARE @table TABLE (var1 VARCHAR(10),var2 VARCHAR(10),var3 VARCHAR(10));
INSERT @table VALUES (@v1,@v2,NULL),(@v1,NULL,NULL),(@v1,NULL,@v3),(NULL,NULL,NULL)

SELECT CONCAT('Label ', ';'+var1, ';'+var2, ';'+var3) as Result
FROM @table;
Result
---------------------------------------
Label ;abc;xyz
Label ;abc
Label ;abc;123
Label 
DECLARE 
  @v1 VARCHAR(10) = 'abc',
  @v2 VARCHAR(10) = 'xyz',
  @v3 VARCHAR(10) = '123';

DECLARE @table TABLE (var1 VARCHAR(10),var2 VARCHAR(10),var3 VARCHAR(10));
INSERT @table VALUES (@v1,@v2,NULL),(@v1,NULL,NULL),(@v1,NULL,@v3),(NULL,NULL,NULL),
                     (@v1,@v2,''),(@v1,'',''),(@v1,'',@v3),(NULL,'',NULL);

SELECT CONCAT('Label ', ';'+NULLIF(var1,''), ';'+NULLIF(var2,''), ';'+NULLIF(var3,'')) as Result
FROM @table;
Result
---------------------------------------
Label ;abc;xyz
Label ;abc
Label ;abc;123
Label 
Label ;abc;xyz
Label ;abc
Label ;abc;123
Label 
    DECLARE @VAR1 VARCHAR(10)
    DECLARE @VAR2 VARCHAR(10)
    DECLAR  @VAR3 VARCHAR(10)
    DECLARE @VAR11 VARCHAR(10)
    DECLARE @VAR22 VARCHAR(10)
    DECLAR  @VAR33 VARCHAR(10)

    SET @VAR1 = …
    SET @VAR2 = … 
    SET @VAR3 = … 

IF @VAR1 IS NOT NULL
BEGIN
    SET @VAR11 = CONCAT(@VAR1,';')
ELSE
SET @VAR11 = ''

IF @VAR2 IS NOT NULL 
BEGIN
    SET @VAR22 = CONCAT(@VAR2,';')
ELSE
SET @VAR22 = ''

IF @VAR3 IS NOT NULL
BEGIN
    SET @VAR33 = CONCAT(@VAR2,';')
ELSE 
SET @VAR33 = ''

    Concat('Label ', ';', @var11, @var22, @var33) as Result