一段 T-SQL 代码在生产和测试环境中的表现不同。当在生产环境中执行以下代码时,将返回数据:
SELECT [col1xml]
FROM [DBName].[dbo].[Table1] (NOLOCK)
WHERE (cast([col1xml] as xml).value('(/Payment/****/trn1)[1]','nvarchar(20)') ='123456'))
然而,当在测试中运行相同的代码时,会出现以下错误。
Msg 9402,级别16,状态1,第9行 XML解析:第1行,第38个字符,无法切换编码
我已经看到了该网站提供的UTF转换修复方法,并且在生产和测试中都有效。但是,我需要向开发人员提供为什么会出现这种情况以及他们应该更改代码的理由(如果有必要)。
WHERE CAST(
REPLACE(CAST(col1xml AS VARCHAR(MAX)), 'encoding="utf-16"', 'encoding="utf-8"')
AS XML).value('(/Payment/****/trn1)[1]','NVARCHAR(max)') ='123456')
我已经比较了两个数据库,并寻找任何明显的问题,例如ANSI空值和ANSI填充。一切都相同,包括SQL Server的版本。这是SQL Server 2012 11.0.5388版本。环境之间的数据不同,但表模式相同,col1xml的数据类型为ntext
。
encoding="utf-8"
替换它们),请将其替换为nothing。大多数XML库都可以被说服不输出XML声明,或者至少不输出带有编码的声明。 - Jeroen Mostertnolock
- Dale K