我认为我需要更好地理解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子句。)
最终,这将进入标量函数,我希望函数返回连接的字符串。
答案 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
您希望如何处理空值取决于您。你可以
COALESCE(Phone,'')
CASE WHEN phone is not null THEN phone + ', ' ELSE '' END
WHERE phone is not null
CONCAT_NULL_YIELDS_NULL = OFF
但是应该弃用答案 1 :(得分:0)
我认为这就是你所需要的:
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