Rac*_*SQL 22 xml sql-server sql-server-2008-r2
我有一个很大的查询(如有必要,我会在此处发布)并且出现此错误:
消息 6841,级别 16,状态 1,第 1 行
FOR XML 无法序列化节点“NoName”的数据,因为它包含 XML 中不允许的字符 (0x0000)。要使用 FOR XML 检索此数据,请将其转换为 binary、varbinary 或 image 数据类型并使用 BINARY BASE64 指令。
我唯一使用的部分FOR XML在这里:
WHERE
(CodFuncionario = Results.CodFuncionario)
FOR XML PATH(''), TYPE).value('(./text())[1]',
'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]
Run Code Online (Sandbox Code Playgroud)
但是,什么是node noname?以及如何查找此值:(0x0000)
这是子查询之一(我拥有 FOR XML 的唯一部分):
SELECT
[CodFuncionario],
STUFF
(
(
SELECT
' / ' +
CAST
(
[DescFuncao] + '-' +
[DescTempoExperiencia]
AS VARCHAR(MAX)
)...
FROM
[Linked_Server].db.dbo.tblFuncionarioExperiencia T0
INNER JOIN
[Linked_Server].db.dbo.tblFuncao T1 On T0.codFuncao = T1.CodFuncao
INNER JOIN
[Linked_Server].db.dbo.tblTempoExperiencia T2 ON T0.CodTempoExperiencia = T2.CodTempoExperiencia
WHERE
(CodFuncionario = Results.CodFuncionario)
FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]
FROM
[Linked_Server].db.dbo.tblFuncionarioExperiencia Results
GROUP BY
CodFuncionario) as T2
On T0.CodFuncionario = T2.CodFuncionario
Left Join...
Run Code Online (Sandbox Code Playgroud)
Rob*_*ley 13
线路:
...
SELECT
[CodFuncionario],
STUFF
(
(
SELECT
' / ' +
CAST
(
[DescFuncao] + '-' +
[DescTempoExperiencia]
AS VARCHAR(MAX)
)...
Run Code Online (Sandbox Code Playgroud)
应该:
...
SELECT
[CodFuncionario],
STUFF
(
(
SELECT
' / ' +
CAST
(
replace -- *** NEW! ***
(
[DescFuncao] + '-' +
[DescTempoExperiencia],
char(0),
''
)
AS VARCHAR(MAX)
)...
Run Code Online (Sandbox Code Playgroud)
Aar*_*and 12
当我这样做时,我得到了同样的错误:
DECLARE @foo VARCHAR(32) = CHAR(0); -- 0x0000
SELECT @foo FOR XML PATH, TYPE;
Run Code Online (Sandbox Code Playgroud)
因此,找到DescFuncaoor 的所有实例DescTempoExperiencia(抱歉,您不使用表别名,因此无法分辨它们来自哪个表)内容包含的位置CHAR(0),并修复它们。例如:
UPDATE dbo.whatever
SET DescFuncao = REPLACE(DescFuncao, CHAR(0), '')
WHERE DescFuncao LIKE '%' + CHAR(0) + '%';
Run Code Online (Sandbox Code Playgroud)
在您的查询中过滤掉这些行是不够的,因为您不知道 XML 方法将在什么时候开始工作,但您也可以尝试:
STUFF(( SELECT ' / ' + CAST(REPLACE([DescFuncao] + '-'
+ [DescTempoExperiencia], CHAR(0), '') AS VARCHAR(MAX))
Run Code Online (Sandbox Code Playgroud)
当然,一次修复源数据比每次都运行这些替换例程要高效得多。
请注意,这可能不是导致此问题的唯一特定字符。0x0001->0x0008也会产生同样的错误。因此,如果您也有这些字符,您应该调查它们的来源,并修复来源。
小智 11
我用 ASCII 字符 0-255 对此进行了测试,发现您收到以下字符错误:0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x000B, 0x000C, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F.
一种解决方法是, TYPE从您的 XML 语句中删除。
另一种方法是删除 select 语句中的那些字符:
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(
REPLACE( REPLACE( REPLACE( REPLACE(
< YOUR EXPRESSION TO BE CLEANED >
,char(0x0000),'') ,char(0x0001),'') ,char(0x0002),'') ,char(0x0003),'') ,char(0x0004),'')
,char(0x0005),'') ,char(0x0006),'') ,char(0x0007),'') ,char(0x0008),'') ,char(0x000B),'')
,char(0x000C),'') ,char(0x000E),'') ,char(0x000F),'') ,char(0x0010),'') ,char(0x0011),'')
,char(0x0012),'') ,char(0x0013),'') ,char(0x0014),'') ,char(0x0015),'') ,char(0x0016),'')
,char(0x0017),'') ,char(0x0018),'') ,char(0x0019),'') ,char(0x001A),'') ,char(0x001B),'')
,char(0x001C),'') ,char(0x001D),'') ,char(0x001E),'') ,char(0x001F),'')
Run Code Online (Sandbox Code Playgroud)
您还可以使用这些替换语句创建一个函数。
| 归档时间: |
|
| 查看次数: |
29800 次 |
| 最近记录: |