0

认为我需要更好地理解 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('')

但这是不允许的(消息 6819,级别 16,状态 3,第 45 行/ASSIGNMENT 语句中不允许使用 FOR XML 子句。)

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

4

2 回答 2

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 语句CASE WHEN phone is not null THEN phone + ', ' ELSE '' END
  • 使用 whereWHERE phone is not null
  • 甚至CONCAT_NULL_YIELDS_NULL = OFF,但这应该被弃用
于 2013-04-08T20:54:31.403 回答
0

我认为这是你需要的:

Sql 小提琴

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
于 2013-04-08T20:55:36.563 回答