如何在T-SQL FOR XML EXPLICIT中添加xsi:nil及Reason属性
用T-SQL直接生成符合要求的XML节点
可以直接通过T-SQL的FOR XML EXPLICIT实现,无需后续处理。关键是利用EXPLICIT模式对节点结构的精确控制,同时引入xsi命名空间来支持xsi:nil属性。
实现步骤与示例代码
- 引入xsi命名空间:确保XML声明中包含
http://www.w3.org/2001/XMLSchema-instance命名空间,避免非法属性报错。 - 拆分两种场景构造节点:分别处理Phone列有值和为NULL的情况,在NULL场景中同时指定
xsi:nil="true"和Reason属性。
以下是完整的测试示例:
-- 1. 创建测试表并插入数据 CREATE TABLE #Contact (ID INT, Phone VARCHAR(20)) INSERT INTO #Contact VALUES (1, '1234567890'), (2, NULL) -- 2. 用FOR XML EXPLICIT生成目标XML WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' AS xsi) SELECT 1 AS Tag, 0 AS Parent, ID AS [Contact!1!ID], -- 有值时输出节点内容,NULL时输出属性 CASE WHEN Phone IS NOT NULL THEN Phone ELSE NULL END AS [Phone!2!!ELEMENT], CASE WHEN Phone IS NULL THEN 'true' ELSE NULL END AS [Phone!2!xsi:nil], CASE WHEN Phone IS NULL THEN 'none' ELSE NULL END AS [Phone!2!Reason] FROM #Contact FOR XML EXPLICIT
输出结果
执行后会生成符合要求的XML:
<Contact ID="1"> <Phone>1234567890</Phone> </Contact> <Contact ID="2"> <Phone xsi:nil="true" Reason="none" /> </Contact>
关键说明
FOR XML EXPLICIT通过Tag和Parent列定义节点层级,[Phone!2!!ELEMENT]指定当Phone有值时作为元素内容输出。- 对于NULL场景,通过
[Phone!2!xsi:nil]和[Phone!2!Reason]直接构造节点属性,这两个属性只会在Phone为NULL时出现。 - 必须通过
WITH XMLNAMESPACES声明xsi命名空间,否则xsi:nil会被视为无效属性。
内容的提问来源于stack exchange,提问作者dbelev
相关产品推荐
相关产品推荐

