我正在尝试使用XML路径表达式从SQL Server 2008表中获取firstname和lastname。数据包含特殊字符。当我尝试使用sql时,出现以下错误:
FOR XML无法序列化节点'LastName'的数据,因为它包含XML中不允许的字符(0x001B)。要使用FOR XML检索此数据,请将其转换为二进制,varbinary或图像数据类型,并使用BINARY BASE64指令
如何重写SQL以在xml中包含这些字符(可能是CDATA?)
SELECT (
SELECT A1.FirstName
, A1.LastName
FROM dbo.kc_consumer AS A1
FOR XML PATH('Consumer') , TYPE)
AS ConsumerData
FOR XML PATH('Element'), ROOT('Elements')
答案 0 :(得分:4)
我使用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
。
一种解决方法是从XML语句中删除, TYPE
。
另一种方法是在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),'')
您还可以使用这些替换语句创建一个函数。
答案 1 :(得分:2)
将TYPE指令拉入外部查询。使用它绕过SQL Server在普通FOR XML语句中所做的字符转义,但是一旦你的结果被转义(使用不带TYPE的FOR XML),你的结果就可以包含在XML TYPE指令语句中。编辑:原来的小提琴已经以某种方式死了。它不稳定。相反,这是一段可行的代码。
DECLARE @kc_consumer table (FirstName VARCHAR(20), LastName VARCHAR(20))
INSERT INTO @kc_consumer VALUES
('John','Smith' + NCHAR(27))
, ('Jane','123ú♂
2⌂¶2<PZdûá╚' + NCHAR(27))
SELECT
(
SELECT
(SELECT A1.FirstName + '' FOR XML PATH('')) FirstName
, (SELECT A1.LastName + '' FOR XML PATH('')) LastName
FROM @kc_consumer AS A1
FOR XML PATH('Consumer'), TYPE
)
FOR XML PATH('Element'), ROOT('Elements'), TYPE;