Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL将多行合并到单个列中_Sql_Sql Server_Tsql - Fatal编程技术网

使用SQL将多行合并到单个列中

使用SQL将多行合并到单个列中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个一对多的表,如果有行具有相同的引用id(段落id),我希望将其连接起来,以便LoginName值在同一行中具有多个 此查询执行我希望它执行的操作,但有一个问题,它将替换第一个字符。STUFF函数需要一个replace值 我的问题: 如何在不替换第一个字符的情况下执行此操作 SELECT DISTINCT ParagraphID , STUFF(( SELECT N'|' + CAST([LoginName] AS VARCHA

我有一个一对多的表,如果有行具有相同的引用id(段落id),我希望将其连接起来,以便LoginName值在同一行中具有多个

此查询执行我希望它执行的操作,但有一个问题,它将替换第一个字符。STUFF函数需要一个replace值

我的问题: 如何在不替换第一个字符的情况下执行此操作

 SELECT DISTINCT
          ParagraphID
        , STUFF((
            SELECT N'|' + CAST([LoginName] AS VARCHAR(255))
            FROM [dbo].[CM_Signature] f2
            WHERE f1.ParagraphID = f2.ParagraphID
            FOR XML PATH ('')), 1, 2, '') AS FileNameString
    FROM [dbo].[CM_Signature] f1

期望值:

Daniel | Emma

你是从位置2开始的,而不是从第一个开始

SELECT DISTINCT
          ParagraphID
        , STUFF((
            SELECT N'|' + CAST([LoginName] AS VARCHAR(255))
            FROM [dbo].[CM_Signature] f2
            WHERE f1.ParagraphID = f2.ParagraphID
            FOR XML PATH ('')), 1, 1, '') AS FileNameString
    FROM [dbo].[CM_Signature] f1    SELECT DISTINCT
              ParagraphID
            , STUFF((
                SELECT N'|' + CAST([name] AS VARCHAR(255))
                FROM mytable f2
                WHERE f1.paragraphid = f2.paragraphid
                FOR XML PATH ('')), 1, 1, '') AS FileNameString
        FROM mytable f1
使用此代码:

create table #test (paragraghid int,name VARCHAR(10))

insert into #test values(1929,'Daniel')
insert into #test values(1929,'Emma')
insert into #test values(1935,'Daniel')   


select distinct paragraghid,STUFF((select ' | ' + name from #test a 
Where a.paragraghid=b.paragraghid for XML PATH('')  ),1,2,'') as FilenameString
from #test b 

以下是您可以使用的:

SELECT DISTINCT
          ParagraphID
        , STUFF((
            SELECT N' | ' + CAST([LoginName] AS VARCHAR(255))
            FROM [dbo].[CM_Signature] f2
            WHERE f1.ParagraphID = f2.ParagraphID
            FOR XML PATH ('')), 1, 1, '') AS FileNameString
FROM [dbo].[CM_Signature] f1
注意
填充(“…”,1,1,”)
而不是
填充(“…”,1,2,”)
。 因为您需要替换1个字符而不是2个字符(以删除第一个
|

输出:

Daniel|Emma
Daniel | Emma
另外,如果希望在
|
前后都有空格,只需使用以下查询:

SELECT DISTINCT
          ParagraphID
        , STUFF((
            SELECT N' | ' + CAST([LoginName] AS VARCHAR(255))
            FROM [dbo].[CM_Signature] f2
            WHERE f1.ParagraphID = f2.ParagraphID
            FOR XML PATH ('')), 1, 3, '') AS FileNameString
FROM [dbo].[CM_Signature] f1
请注意,这次我们删除了3个字符(
STUFF(“…”,1,3,”)

输出:

Daniel|Emma
Daniel | Emma

您可以将查询编写为:

DECLARE @CM_Signature table 
(
RowId int,
ParagraphID int,
LoginName varchar(10))
Insert into @CM_Signature values
(4,1929,'  Daniel'),
(5,1929,'    Emma  '),
(6,1935,'Daniel')

SELECT DISTINCT
          ParagraphID
        , STUFF((
            SELECT N'| ' + CAST(rtrim(ltrim([LoginName])) AS VARCHAR(255))
            FROM @CM_Signature f2
            WHERE f1.ParagraphID = f2.ParagraphID
            FOR XML PATH ('')), 1, 1, '') AS FileNameString
    FROM @CM_Signature f1

给出示例数据和预期输出…在我看来,您好像在某处窃取了此查询,而您不知道发生了什么;)@KavinChakaravarthi更新您的预期输出是
Aniel | Emma
还是
Daniel | Emma
?这很令人困惑,因为你提供的样本与你的描述不符。@sébastienSevrin Daniel | Emma