У меня есть образцы данных вроде

CREATE TABLE #Employee
(Id INT, Name NVARCHAR(100), Status TINYINT)
GO
INSERT INTO #Employee ( Id, Name, Status)
Values (1, '&Basavaraj Biradar', 0),
        (2, 'Shree Biradar', 0),
        (3, '&Kalpana Biradar', 0),
        (4, '& ', 0)
GO

Когда нет специальных символов, все идет нормально, но когда символы вроде - или &. это не идет

Ошибка отображается как

Msg 9411, Level 16, State 1, Line 2
XML parsing: line 1, character 14, semicolon expected

Мой запрос такой:

select cast('<N>'+replace(replace(replace(Name, ' ', '</N><N>'),' ', '</N><N>'),'-','-</N><N>')  +'</N>' as xml) from #Employee

Когда имя имеет обычную строку, оно работает нормально, но не для специальных символов. Предложи мне

3
mohan111 23 Фев 2016 в 09:45

2 ответа

Лучший ответ

Попробуйте так:

CREATE TABLE #Employee
(Id INT, Name NVARCHAR(100), Status TINYINT)
GO
INSERT INTO #Employee ( Id, Name, Status)
Values (1, '&Basavaraj Biradar', 0),
        (2, 'Shree Biradar', 0),
        (3, '&Kalpana Biradar', 0),
        (4, '& ', 0)
GO

select cast('<N>'+replace(replace(Name,'&','&amp;'), ' ', '</N><N>')  +'</N>' as xml) from #Employee

--DROP TABLE #Employee
0
Shnugo 23 Фев 2016 в 07:11

Амперсанд - это специальный символ в XML, поэтому вам нужно его избегать. Вместо этого используйте &amp;.

Следуя шаблону из существующего кода, замените ссылку на поле Name на replace(Name, '&', '&amp;')

Обновленный запрос

select cast('<N>'+replace(replace(replace( replace( Name, '&', '&amp;')  , ' ', '</N><N>'),' ', '</N><N>'),'-','-</N><N>')  +'</N>' as xml) from #Employee

И я получаю это в результате

<N>&amp;Basavaraj</N><N>Biradar</N> 
<N>Shree</N><N>Biradar</N>
<N>&amp;Kalpana</N><N>Biradar</N> 
<N>&amp;</N><N />
2
Babak Naffas 24 Фев 2016 в 05:36