SQL 服务器在传递给字符串变量时忽略双引号

Double Quotes are being ignored by SQL Server when passed to a string variable

我在 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)
                       )
           )

这个答案是将 " 替换为 ''''。虽然它只会打印单引号。对于浏览器来说,用 " 双引号打开 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)))'