Замените «<» и «>» и «<\» на «<», «>» и - PullRequest
1 голос
/ 14 мая 2019

Я знаю, что заменить &lt; и &gt; на < и > на сервере sql спросили на

Заменить «<» и «>» на «<»и «>» в ​​SQL Server

, но мне нужно расширить его.Я пытаюсь создать отформатированный HTML-код с SQL-сервера MS 2016.

Что у меня есть:

DECLARE @json nvarchar(max) = (SELECT DISTINCT AU2.PMID, 
SUBSTRING(
(
 SELECT ', '+  CASE WHEN AU1.Format IS Not Null Then +'<b>' + 
 AU1.LastName+ ' ' + AU1.Initials + '</' + AU1.Format + '>' ELSE
 AU1.LastName + ' ' + AU1.Initials END   AS [text()]
 FROM dbo.[Publication.PubMed.Author] AU1
 WHERE AU1.PMID = AU2.PMID
 ORDER BY AU1.PmPubsAuthorID
 FOR XML PATH ('')
), 3, 1000) + '. Journal Name ' [Authors]
FROM dbo.[Publication.PubMed.Author] AU2
WHERE AU2.[PMID] =27702896   FOR JSON AUTO)

SELECT @json

И что я получаю обратно:

Name DG, Name K, Name A, Chen FK, Song X, Pirun M, Santiago PM, Kim-Kiselak C, Platt JT, Lee E, Hodges E, &lt;b&gt;Rosebrock AP&lt;/b&gt;, Bronson RT, Socci ND, Hannon GJ, Jacks T, Varmus H Journal Name 

Если я попытаюсь ввести ТИП в

FOR XML PATH(''), TYPE 

Я получаю сообщение об ошибке:

Тип данных аргумента xml недопустим для аргумента 1 функции подстроки.

Я пытался добавить REPLACE

replace(CASE WHEN AU1.Format IS Not Null Then +'<b>' + 
AU1.LastName+ ' ' + AU1.Initials + '</b>' ELSE
AU1.LastName + ' ' + AU1.Initials END,  '&lt;', '<') 

Но тогда я получаю сообщение об ошибке

Тип данных xml нельзя выбрать как DISTINCT, потому что он несопоставим.

Лучшее, чтоЯ могу придумать:

SET @json = replace(@json, '&lt;\', '<')
SET @json = replace(@json, '&lt;', '<')
SET @json = replace(@json, '&gt;', '>')

Непосредственно перед финалом SELECT @json.

У меня будет более 1000 записей, которые мне нужно вытащить.Нужно ли делать это по шагам?

На основании кода ТТ я изменил свой на

         DECLARE @json nvarchar(max) = (SELECT DISTINCT AU2.PMID, 
        SUBSTRING(
    (
        SELECT ', '+  CASE WHEN AU1.Format IS Not Null Then +'<b>' + 
         AU1.LastName+ ' ' + AU1.Initials + '</b>' ELSE
         AU1.LastName + ' ' + AU1.Initials END   AS [text()]
        FROM dbo.[Publication.PubMed.Author] AU1
        WHERE AU1.PMID = AU2.PMID
        ORDER BY AU1.PmPubsAuthorID
        FOR XML PATH (''),TYPE).value('.[1]','NVARCHAR(MAX)'
    ), 1, 1000) + '. Journal Name ' [Authors]
      FROM dbo.[Publication.PubMed.Author] AU2
     WHERE AU2.[PMID] =27702896   FOR JSON AUTO)

И это прекрасно работает.но см. комментарий ниже

1 Ответ

1 голос
/ 14 мая 2019

Насколько я могу судить, вы на правильном пути с FOR XML PATH(''), TYPE.Просто тогда у вас есть текстовое значение XML, которое вам нужно преобразовать в строку (например, типа [N]VARCHAR(X)).Это можно сделать с помощью метода XML value() .

Пример ( fiddle ):

CREATE TABLE t(s NVARCHAR(16));
INSERT INTO t(s)VALUES(N'1'),(N'2'),(N'3'),(N'4'),(N'5'),(N'6');

SELECT
  (
    SELECT N'<b>'+s+N'</b>'
    FROM t
    FOR XML PATH(''),TYPE
   ).value('.[1]','NVARCHAR(MAX)');

приводит к

<b>1</b><b>2</b><b>3</b><b>4</b><b>5</b><b>6</b>
...