Двойные кавычки игнорируются SQL Server при передаче в строковую переменную

Я написал хранимую процедуру в SQL Server 2016, которая генерирует файл XML

При создании XML-файла мне нужно явно указать кодировку. Вот почему я добавил эту явную кодировку к результату содержимого XML.

SELECT @SQLStr = 
'SELECT N''<?xml version="1.0" encoding="UTF-8"?>'' 
            + (SELECT CAST((SELECT [Id], [FirstName], [LastName], [Address] 
                            FROM InputTemp.dbo.XMLTest AS Body 
                            WHERE Id = '''  + str(@Id) + ''' 
                            FOR XML AUTO, ELEMENTS) AS NVARCHAR(MAX)
                          )
              )'

Проблема в том, что двойные кавычки ", которые требуются для кодирования, игнорируются при передаче в переменную. Поэтому, когда я открываю этот сгенерированный XML-файл в браузере, он выглядит совершенно пустым. Но когда я открываю в текстовом редакторе, все отображается правильно, за исключением того, что нет двойных кавычек около 1,0 и UTF-8 (например, <?xml version=1.0 encoding=UTF-8?>). Как только я добавлю двойные кавычки, я смогу правильно увидеть содержимое файла XML в браузере.

SET QUOTED_IDENTIFIER ON

Этот вариант не помог.

Но когда я запускаю это утверждение отдельно, появляются двойные кавычки.

SELECT N'<?xml version="1.0" encoding="UTF-8"?>' 
         + (SELECT CAST((SELECT [Id], [FirstName], [LastName], [Address] 
                         FROM InputTemp.dbo.XMLTest AS Body 
                         WHERE Id = '''  + str(@Id) + ''' 
                         FOR XML AUTO, ELEMENTS) AS NVARCHAR(MAX)
                       )
           )

1 ответ

Решение

Этот ответ должен заменить "на". Хотя он будет печатать только одинарные кавычки. Для браузера достаточно открыть файл XML с "двойными кавычками".

Обратите внимание, что уровень совместимости базы данных должен быть 2016.

SELECT @SQLStr = 
'SELECT N''<?xml version=''''1.0'''' encoding=''''UTF-8''''?>'' + (SELECT CAST((SELECT [Id], [FirstName], [LastName], [Address] FROM InputTemp.dbo.XMLTest AS Body WHERE Id = '''  + str(@Id) + ''' FOR XML AUTO, ELEMENTS) AS NVARCHAR(MAX)))'
Другие вопросы по тегам