将列加入字符串

时间:2013-04-08 20:18:38

标签: sql-server xml tsql xpath

认为我需要更好地理解FOR XML PATH才能使其正常工作。也许你可以用这个简单的例子来帮助我:

鉴于

DECLARE @p VARCHAR(200)
DECLARE @phn TABLE (Phone VARCHAR(25))
INSERT INTO @phn VALUES('204-721-1532')
INSERT INTO @phn VALUES('306-922-2058')
INSERT INTO @phn VALUES('204-728-3852')

我想将@ phn.Phone中的所有行更改为VARCHAR,如果它只是Python,则会像

一样
SET @p = ', '.join(@phn.Phone) # Alas

现在,这个可以解决问题:

SELECT DISTINCT Phone+', ' FROM @phn FOR XML PATH('')
==> 204-721-1532, 204-728-3852, 306-922-2058, 

有那个尾随逗号,但没有问题。我需要的是将此结果转换为VARCHAR变量,如

SELECT DISTINCT @p = Phone+', ' FROM @phn FOR XML PATH('')

但是这是不允许的(Msg 6819,Level 16,State 3,Line 45 / ASSIGNMENT声明中不允许使用FOR XML子句。)

最终,这将进入标量函数,我希望函数返回连接的字符串。

2 个答案:

答案 0 :(得分:0)

您不需要XML路径,只需选择

DECLARE @p VARCHAR(200)
DECLARE @phn TABLE (Phone VARCHAR(25))
INSERT INTO @phn VALUES('204-721-1532')
INSERT INTO @phn VALUES('306-922-2058')
INSERT INTO @phn VALUES('204-728-3852')


SET @p = ''
SELECT @p = @p + phone + ', '  from @phn

SELECT @P

DEMO

您希望如何处理空值取决于您。你可以

  • 添加COALESCE(Phone,'')
  • 使用案例陈述CASE WHEN phone is not null THEN phone + ', ' ELSE '' END
  • 使用where WHERE phone is not null
  • 甚至CONCAT_NULL_YIELDS_NULL = OFF但是应该弃用

答案 1 :(得分:0)

我认为这就是你所需要的:

Sql Fiddle

DECLARE @p VARCHAR(200)
DECLARE @phn TABLE (Phone VARCHAR(25))
INSERT INTO @phn VALUES('204-721-1532')
INSERT INTO @phn VALUES('306-922-2058')
INSERT INTO @phn VALUES('204-728-3852')

--Using Isnull() function to eliminate tralling comma
select @p = isnull(@p + ', ','') + Phone
from @phn

select @p

Results: 
204-721-1532, 306-922-2058, 204-728-3852