【问题标题】:Concatenate text from multiple rows into a single text string in SQL server? [duplicate]将多行中的文本连接成 SQL Server 中的单个文本字符串? [复制]
【发布时间】:2021-08-26 12:16:54
【问题描述】:

我在 SQL-Server 数据库 (SQL-Server 2016) 中有一个包含 2 个字段的表:

ConcateCode 

ID int,
Random nchar(5)
ID  Random

1   A2dd4
2   2f4mR
3   dhu9q
4   0lpms

现在我需要一个查询,将所有随机字段连接到一个字段中,从 Start-ID 到 End-ID,例如像

SELECT ConcateCode FROM Table WHERE ID >= 1 AND ID < 5

并返回A2dd42f4mRdhu9q0lpms

问题是我不能使用存储过程,因为我的编程语言不支持存储过程,而只支持直接表访问或查询。

这个问题听起来很简单,但我现在尝试解决这个问题一个星期,但没有得到任何解决方案。希望有人比我更聪明。

【问题讨论】:

  • 这里的原理和SQL server中创建逗号分隔值的原理是一样的,只是用一个零长度的字符串('')作为分隔符。你做了哪些尝试,为什么没有奏效?

标签: sql-server tsql sql-server-2016


【解决方案1】:

试试这个:

DECLARE @MyTable TABLE (ID int, Random nchar(5))
INSERT INTO @MyTable VALUES 
        ( 1, 'A2dd4')
    ,   ( 2, '2f4mR')
    ,   ( 3, 'dhu9q')
    ,   ( 4, '0lpms')
;
DECLARE @StartID    int = 1
    ,   @EndID      int = 5
;
DECLARE @String varchar(max) = (SELECT ''+Random FROM @MyTable WHERE ID BETWEEN @StartID AND @EndID FOR XML PATH('') );

SELECT @String;

【讨论】:

  • 感谢 Andy3B,但我如何才能在视图中看到它?只有在我的编程环境中,我只能使用表和视图。
  • 您不能将参数传递给视图(即@StartID 和@EndID)。如何创建一个标量函数?
【解决方案2】:
DECLARE @Result VARCHAR(MAX)
DECLARE @StartID    int = 1
,   @EndID      int = 5

SELECT @Result= COALESCE(@Result, '') + ConcateCode FROM Table
WHERE ID BETWEEN @StartID AND @EndID
SELECT @Result

【讨论】:

  • 使用变量赋值连接字符串(SELECT @Column += ....)是undocumented and unreliable。它并不总是按预期工作。您应该使用STRING_AGG()(如果使用支持它的版本),或者使用XML Extensions 将行连接成一个变量
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多