Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server XML路径(';';)在连接行时的工作原理_Sql Server_Tsql_For Xml Path - Fatal编程技术网

Sql server XML路径(';';)在连接行时的工作原理

Sql server XML路径(';';)在连接行时的工作原理,sql-server,tsql,for-xml-path,Sql Server,Tsql,For Xml Path,当连接SQL Server中的行时,XML路径(“”)子句如何工作 我只想解释一下FOR XML PATH(“”)子句是如何工作的…FOR XML PATH('xxx')所做的是为resultset创建一个XML字符串,该字符串将每一行放在元素中,并将每一列值放在该列的名称所在的元素中 如果路径为空(即PATH(“”)),则会在XML生成中忽略行元素。如果列没有名称,它将在XML生成中忽略column元素。当路径为空且列没有名称时,它实际上成为所有行的字符串连接 运行以下语句以更好地了解流程:

当连接SQL Server中的行时,XML路径(“”)子句如何工作

我只想解释一下
FOR XML PATH(“”)
子句是如何工作的…

FOR XML PATH('xxx')所做的是为resultset创建一个XML字符串,该字符串将每一行放在
元素中,并将每一列值放在该列的名称所在的元素中

如果路径为空(即
PATH(“”)
),则会在XML生成中忽略行元素。如果列没有名称,它将在XML生成中忽略column元素。当路径为空且列没有名称时,它实际上成为所有行的字符串连接

运行以下语句以更好地了解流程:

-- Each row is in a <beta></beta> element
-- Each column in that row in a <alfa></alfa> element (the column name)
SELECT
    alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('beta');

-- Since the PATH is empty, the rows are not put inside an element
-- Each column in that row is in a <alfa></alfa> element (the column name)
SELECT
    alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

-- Since the PATH is empty, the rows are not put inside an element
-- Since the column has no name it is not put inside an element     
SELECT
    ','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

-- This uses the STUFF function to remove the leading comma to get a proper comma-seperated list    
SELECT STUFF((
    SELECT
        ','+TABLE_SCHEMA + '.' + TABLE_NAME
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('')
    ),1,1,''
) AS comma_seperated_list;

这是一种虐待。顾名思义,此功能的目的是生成XML。碰巧,某些功能组合意味着它可以用来连接字符串。@Damien_不相信的人在SQL Server中有更好的方法吗?Ie更简洁,性能更好?“有没有更好的方法”-是的-“在SQL Server中”-不是真的。这是字符串操作,通常最好使用具有强大字符串操作功能的语言。T-SQL不是其中之一。因此,如果可能,请将此格式/表示逻辑移出数据库。@Damien\u不相信T-SQL的人可以这样做,但只能在Sybase SQL Anywhere(
LIST()
)中这样做。事实上,许多(如果不是大多数的话)SQL实现都可以做到这一点。MySQL(
group_-concat()
)、Oracle(
listag()
)、PostgreSQL(
string_-agg()
)、DB2(
listag()
)SQLite(
group_-concat()
)和Firebird(
LIST()
)的最新版本。在Postgres、Oracle和我相信DB2中,这些函数也是分析函数,因此它们支持窗口化。虽然我同意它应该由应用程序在显示中处理,但报告编写软件在这方面通常非常缺乏灵活性。@MartinSmith噢,snap!我没看到。我对SQL Server最大的不满终于得到了解决。当2016年只包括
string\u split
string\u escape
时,我非常恼火。现在,我只能等到2017年迁移到SQL Server,这可能是2050年之前的某个时候。
SELECT
    [text()]=TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

SELECT
    (SELECT TABLE_NAME)
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

SELECT
    CAST(TABLE_NAME AS SYSNAME)
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');