BizTalk 2013R2 Schema配置疑问:如何确保空值元素在消息中始终存在?
解决BizTalk Schema无法输出所有元素(含NULL值元素)的问题
我之前也碰到过一模一样的情况,核心问题出在WCF-SQL适配器对数据库NULL值的默认处理逻辑上——哪怕你在Schema里把minOccurs="1"和nillable="true"都设置好了,适配器默认也不会为数据库中的NULL值生成对应的XML元素,这就是你看不到date_left的原因(而空字符串hus_id能生成空元素,是因为适配器会把空字符串识别为非NULL的空值)。
下面是几个可行的解决步骤,按优先级排序:
1. 开启WCF-SQL适配器的「生成NULL值空节点」选项
这是最直接、最标准的解决方案:
- 打开你的WCF-SQL端口配置,找到Typed Polling的操作设置面板
- 勾选
Generate empty nodes for NULL values选项 - 保存配置后重新测试,此时数据库中的NULL值会被生成为带
xsi:nil="true"的元素,比如:
这样就能保证所有元素都出现在接收消息里,完全符合你Schema的<date_left xsi:nil="true"/>minOccurs="1"和nillable="true"设置。
2. 检查接收管道的XML Disassembler设置
有时候适配器生成了空节点,但接收管道又把它移除了:
- 打开接收管道的XML Disassembler组件配置
- 确认
Remove empty nodes选项没有被勾选(如果勾选了,哪怕适配器生成了空节点,也会被管道过滤掉)
3. 备选方案:在SQL查询中处理NULL值(谨慎使用)
如果因为权限或其他限制无法修改适配器配置,可以在Typed Polling的SQL查询里把NULL转换成空值,但要注意数据类型的兼容性:
- 对于字符串类型:
ISNULL(hus_id, '') AS hus_id - 对于日期类型,需要先转换为字符串(但这样可能会和Schema的
xs:date类型冲突,要确认下游系统是否接受):
这种方式会生成SELECT account_id, ISNULL(hus_id, '') AS hus_id, CAST(ISNULL(date_left, '') AS VARCHAR(10)) AS date_left FROM YourTargetTable<date_left/>这样的空元素,但不会带xsi:nil="true",适合下游系统不要求nil属性的场景。
4. 最后确认Schema的有效性
再快速检查一遍你的Schema:
- 确保所有需要强制出现的元素都正确设置了
minOccurs="1"和nillable="true" - 确认Schema的
targetNamespace和消息类型完全匹配,避免BizTalk使用了默认生成的Schema而非你自定义的版本
内容的提问来源于stack exchange,提问作者mrc85
相关产品推荐
相关产品推荐

