【发布时间】:2016-02-27 06:39:58
【问题描述】:
在玩sys.dm_exec_describe_first_result_set 的过程中,我明白了这一点:
CREATE TABLE #tab(col INT, x XML );
INSERT INTO #tab(col,x) VALUES (1,NULL), (2,NULL), (3,'<a>x</a>');
SELECT 'Simple XML' AS description, name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT col
FROM #tab
FOR XML AUTO', NULL, 0)
UNION ALL
SELECT 'Wrapped with subquery', name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT(SELECT col
FROM #tab
FOR XML AUTO) AS wrapped_subquery', NULL, 0)
UNION ALL
SELECT 'XML column', name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT x FROM #tab ', NULL, 0)
UNION ALL
SELECT 'Casted XML', name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT CAST(''<o>O</o>'' AS XML) AS x', NULL, 0)
UNION ALL
SELECT 'Wrapped Casted XML', name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT (SELECT CAST(''<o>O</o>'' AS XML) AS x) AS wrapped', NULL, 0)
UNION ALL
SELECT 'Text value', name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT CAST(''aaa'' AS NTEXT) AS text_string', NULL, 0)
UNION ALL
SELECT 'Wrapped Text Value', name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT (SELECT CAST(''aaa'' AS NTEXT)) AS text_string_wrapped', NULL, 0)
输出:
╔═══════════════════════╦═════════════════════════════════════════╦══════════════════╗
║ Description ║ name ║ system_type_name ║
╠═══════════════════════╬═════════════════════════════════════════╬══════════════════╣
║ Simple XML ║ XML_F52E2B61-18A1-11d1-B105-00805F49916 ║ ntext ║
║ Wrapped with subquery ║ wrapped_subquery ║ nvarchar(max) ║
║ XML column ║ x ║ xml ║
║ Casted XML ║ x ║ xml ║
║ Wrapped Casted XML ║ wrapped ║ xml ║
║ Text value ║ text_string ║ ntext ║
║ Wrapped Text Value ║ text_string_wrapped ║ ntext ║
╚═══════════════════════╩═════════════════════════════════════════╩══════════════════╝
还有:
SELECT col -- SSMS result grid - XML column
FROM #tab
FOR XML AUTO
SELECT(SELECT col -- text column
FROM #tab
FOR XML AUTO) AS wrapped_subquery
问题:
- 为什么
FOR XML AUTO不返回XML/NVARCHAR(MAX)数据类型而是ntext(已弃用的数据类型!)? - 用子查询包装如何将数据类型从
ntext更改为nvarchar(max)? - 为什么相同的规则不适用于
XML/NTEXT列?
我知道我的问题可能与技术和内部运营有关,但我将不胜感激 MSDN/Connect 中的任何见解或文档?
编辑:
有趣的是,当我使用普通表(不是临时表)时,它会返回所有ntext:
╔════════════════════════╦═══════════════════════════════════════╦══════════════════╗
║ description ║ name ║ system_type_name ║
╠════════════════════════╬═══════════════════════════════════════╬══════════════════╣
║ Simple XML ║ XML_F52E2B61-18A1-11d1-B105-00805F499 ║ ntext ║
║ Wrapped with subquery ║ wrapped_subquery ║ ntext ║
║ XML column ║ x ║ ntext ║
║ Casted XML ║ x ║ ntext ║
║ Wrapped Casted XML ║ wrapped ║ ntext ║
║ Text value ║ text_string ║ ntext ║
║ Wrapped Text Value ║ text_string_wrapped ║ ntext ║
╚════════════════════════╩═══════════════════════════════════════╩══════════════════╝
SQL Server 对 xml (Transact-SQL) 的支持使您可以选择 请求将 FOR XML 查询的结果通过指定 TYPE 指令作为 xml 数据类型返回。
SQL Server 将 XML 数据类型实例数据作为 不同服务器结构的结果,例如使用 FOR XML 查询 TYPE 指令,或者 xml 数据类型用于返回 XML 来自 SQL 表列和输出参数的实例数据值。在 客户端应用程序代码,ADO.NET 提供程序请求此 XML 数据 要从服务器以二进制编码发送的类型信息。 但是,如果您使用的 FOR XML 没有 TYPE 指令,则 XML 数据以字符串类型返回。
还有:
SELECT 'Simple XML' AS description, name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT col AS col
FROM #tab
FOR XML AUTO, TYPE', NULL, 0)
UNION ALL
SELECT 'Wrapped with subquery', name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT(SELECT col
FROM #tab
FOR XML AUTO,TYPE) AS wrapped_subquery', NULL, 0);
- 为什么
ntext不是nvarchar(max)引用the XML data comes back as a string type以及正常/临时表的区别在哪里?
【问题讨论】:
-
@MartinSmith 如果您为该列命名:
[XML_F52E2B61-18A1-11d1-B105-00805F49916B]则 SSMS 将其视为相同 -
@SteveFord - 这很有趣,可能是quite useful too。显然这是the GUID associated with the IXMLDocument Interface
标签: sql sql-server xml tsql sql-server-2012