Tsql 合并在sql server中是如何工作的?

Tsql 合并在sql server中是如何工作的?,tsql,sql-server-2012,coalesce,Tsql,Sql Server 2012,Coalesce,问题1: Create table test(Names varchar(100) primary key ) insert into test values('Hugeman') insert into test values('Jack') insert into test values('William') insert into test values('Kevin') insert into test values('Peter') 这将导致 胡格曼+杰克+凯文+彼得+威廉 问题2

问题1:

Create table test(Names varchar(100) primary key )

insert into test values('Hugeman')
insert into test values('Jack')
insert into test values('William')
insert into test values('Kevin')
insert into test values('Peter')
这将导致 胡格曼+杰克+凯文+彼得+威廉

问题2

declare @sql varchar(100)
select   @sql = coalesce(@sql+'+','')+Names from test order by names-- where object_id =object_id('temp')  
print @sql
这将导致威廉+

根据coalesce的文档,将返回第一个NOTNULL值。因此它必须产生Hugeman+。但它返回整行


为什么query2没有这样做?

@sql位于第一个附加的右侧


在最后一行,@sql单独位于左侧,并且具有最后一行的值

,这与COALESCE没有严格的联系

尝试以下选择:

declare @sql varchar(100)
select   @sql = coalesce(Names+'+','')  from test order by names-- where object_id =object_id('temp')  
print @sql
发生了什么事?对于选定的每个记录:

在查询1中,您不断向@sql添加值 在查询2中,您将@sql重置为提取的姓氏 我不太清楚您希望从SELECT中获得什么,但一个更好的合并示例可以是:

DECLARE @sql1 AS VARCHAR(1000)
SELECT @sql1 = ISNULL(@sql1, '') + Names FROM test ORDER BY Names
PRINT @sql1

DECLARE @sql2 AS VARCHAR(1000)
SELECT @sql2 = Names FROM test ORDER BY Names
PRINT @sql2

Query-1:将所有行的值追加到@sql 查询-2:将值重新设置为@sql

下面是按名称排序的行

胡格曼 杰克 凯文 彼得 威廉

Query-1将所有值追加到@sql。
Query-2将值重新写入@sql,因此列表中的最后一行是William,因此当您打印变量时,将打印最后一个重新分配的值。

合并函数将列中的第一个非空值作为合并函数中的参数返回

e、 g

CREATE TABLE TEST2(Name VARCHAR(100) PRIMARY KEY, Telephone VARCHAR(10), Mobile VARCHAR(10))

INSERT INTO TEST2 VALUES('Hugeman', 1, 2)
INSERT INTO TEST2 VALUES('Jack', NULL, 3)
INSERT INTO TEST2 VALUES('William', 4, NULL)
INSERT INTO TEST2 VALUES('Kevin', 5, 6)
INSERT INTO TEST2 VALUES('Peter', NULL, NULL)

SELECT Name,
    COALESCE(Telephone, Mobile) AS Tel
FROM TEST2
SELECTCOALESCE(null,null,1,2)     ///return --1

SELECT Id, COALESCE(FirstName, MiddleName, LastName) AS Name
FROM tblEmployee           //return 1st non null value from FirstName/MiddleName/LastName