尝试寻找解释

10 浏览
0 Comments

尝试寻找解释

表格如下:\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

Id Name
1 aaa
1 bbb
1 ccc
1 ddd
1 eee

\n需要的输出结果如下:\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

Id abc
1 aaa,bbb,ccc,ddd,eee

\n查询语句如下:\n

SELECT ID, 
    abc = STUFF(
                 (SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, ''
               ) 
FROM temp1 GROUP BY id

\n这个查询语句可以正常工作。但我只需要解释它是如何工作的,或者是否有其他更简洁的方法来实现这个目标。\n我对理解这个语句感到非常困惑。

0
0 Comments

问题的出现原因是在生成XML时使用了PATH模式。当SELECT查询中的列没有指定别名时,生成的子元素名称与SELECT查询中的列名相同。在每个结果集的行中添加了一个标签。

解决方法是使用不同的SELECT查询语句来生成不同的XML结果。可以通过指定空字符串作为PATH模式的参数来避免生成包装元素。可以使用GROUP BY子句来对数据进行分组。还可以使用STUFF函数在生成XML之前对字符串进行操作。

在第4步中,通过在列名前添加一个逗号,并在XML PATH之后指定一个空字符串,实现了字符串的连接操作。

在第6步中,通过使用GROUP BY子句对ID进行分组,将结果按ID进行分组。

在使用STUFF函数时,可以通过指定要删除的字符的位置、长度和要插入的字符来修改源字符串。

总结上述内容,就是在生成XML时使用了PATH模式,不同的SELECT查询语句可以生成不同的XML结果,可以通过指定空字符串、使用GROUP BY子句或使用STUFF函数来操作字符串。

0
0 Comments

这篇文章介绍了在SQL中连接字符串的各种方法,包括改进版本的代码,该代码不会对连接的值进行XML编码。

要理解发生的情况,请从内部查询开始:

SELECT ',' + name
FROM temp1 As T2
WHERE T2.ID = 42 -- 从表中选择一个随机的ID
ORDER BY name
FOR XML PATH (''), TYPE

由于指定了FOR XML,您将获得包含表示所有行的XML片段的单个行。

因为您没有为第一列指定列别名,每行将被包装在FOR XML PATH后面的括号中指定的XML元素中。例如,如果您有FOR XML PATH ('X'),您将获得一个类似于以下的XML文档:

,aaa
,bbb
...

但是,由于您没有指定元素名称,您只会得到一个值列表:

,aaa,bbb,...

.value('.', 'varchar(max)')只是从生成的XML片段中检索值,而不对任何"特殊"字符进行XML编码。现在您有一个看起来像这样的字符串:

',aaa,bbb,...'

然后,STUFF函数删除了开头的逗号,得到最终的结果:

'aaa,bbb,...'

乍一看,它看起来很困惑,但与其他一些选项相比,它的性能确实相当不错。

看起来有点困惑,但我几乎完全理解了解释和逻辑。

在您的查询中,Type有什么用。我认为它用于定义XML路径的结果将存储在值中(如果错误,请解释)。

:TYPE指令告诉SQL使用xml类型返回数据。如果没有指定,则数据将作为nvarchar(max)返回。在这里,它用于避免如果name列中存在特殊字符的XML编码问题。

STUFF和type/.value的组合对我的查询有很大的影响。我有一个开销很大的表值函数XML reader。我只留下了STUFF,对我的情况起作用。

我注意到,如果删除参数TYPE和删除.value('.', 'varchar(max)'),那么它的工作方式相同。TYPE似乎将其转换为XML数据类型,而.value('.', 'varchar(max)')将其转换回来。因此,您可以将两者都删除。(我不是专家,但是也许包含这两个东西有一些优势?)

:正如SimpleTalk文章中所解释的那样,如果删除TYPE和.value('.', 'varchar(max)'),则结果中可能会出现XML编码的实体。

您是指数据包含或可能包含尖括号吗?

:尖括号、和号、引号、撇号或任何其他需要在XML中使用的字符。

我有一个问题,'item 1 & item 2'变成了'item 1 & item 2',这个答案解决了这个问题(使用TYPE和.value...),谢谢你。

“但是,由于您没有指定元素名称,您只会得到一个值列表”,这是我所缺少的见解。谢谢。

varchar(max)截断了我的最终结果,其长度超过了'max',我该如何防止这种情况发生?

varchar(max)最多可以存储2GB的数据。如果需要连接的数据超过此限制,则需要在SQL Server之外进行连接。如果在.NET中进行连接,也无法完成,因为.NET字符串的最大长度也为2GB。

0
0 Comments

这个问题的出现原因是:在查询结果中,需要将多个值组合成一个字符串。在给定的示例中,需要将temp1表中的name字段的所有值组合成一个以逗号分隔的字符串。解决这个问题的方法是使用SQL Server中的FOR XML PATH和STUFF函数。

FOR XML PATH是一个用于将查询结果输出为XML元素的选项,通过在查询的末尾添加FOR XML PATH,可以将查询结果输出为XML元素,其中元素名包含在PATH参数中。例如,在给定的示例中,通过运行以下语句:

SELECT ',' + name 
FROM temp1
FOR XML PATH ('')

通过传入空字符串(FOR XML PATH('')),可以得到以下结果:

,aaa,bbb,ccc,ddd,eee

STUFF语句用于将一个字符串插入另一个字符串中,从而替换第一个字符串中的字符。在这个示例中,我们使用它来移除结果列表中的第一个字符。具体的语句如下:

SELECT abc = STUFF((
            SELECT ',' + NAME
            FROM temp1
            FOR XML PATH('')
            ), 1, 1, '')
FROM temp1

STUFF函数的参数包括:

- 要插入的字符串(在这个例子中是带有前导逗号的所有name的完整列表)

- 删除和插入字符的位置(1,我们将其插入到一个空字符串中)

- 要删除的字符数(1,即前导逗号)

这样我们得到的结果是:

aaa,bbb,ccc,ddd,eee

接下来,我们将这个结果与temp表中的id列表进行连接,以获取带有name的ID列表:

SELECT ID,  abc = STUFF(
             (SELECT ',' + name 
              FROM temp1 t1
              WHERE t1.id = t2.id
              FOR XML PATH (''))
             , 1, 1, '') from temp1 t2
group by id;

最终我们得到了如下结果:

Id     Name
1      aaa,bbb,ccc,ddd,eee

以上就是解决这个问题的方法和原因。通过使用FOR XML PATH和STUFF函数,我们可以将多个值组合成一个字符串,并且可以根据需要进行连接和处理。

0