由于引号,SQL to XML无法创建正确的XMLNAMESPACE(我认为)

克里斯·西蒙斯

我有以下查询:

WITH XMLNAMESPACES ('CommonImport StudentRecordCount="1" 
xsi:schemaLocation="http://collegeboard.org/CommonImport CommonImport.xsd" 
xmlns="http://collegeboard.org/CommonImport" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' AS CommonImport)
SELECT B.award_year_token AS [StudentID/AwardYearToken]
  ,A.student_ssn AS [StudentID/SSN]
  ,A.last_name AS [StudentName/LastName]
  ,A.first_name AS [StudentName/FirstName]
  ,A.alternate_id AS [StudentName/AlternateID]
  ,'2807' AS [CustomStrings/CustomString/FieldID]
  ,C.processed_status AS [CustomStrings/CustomString/Value]
  ,'2506' AS [CustomDates/CustomDate/FieldID]
  ,CAST (C.date_processed AS DATE) AS [CustomDates/CustomDate/Value]
FROM [dbo].[student] A INNER JOIN [stu_award_year] B ON A.[student_token] = B.[student_token]
LEFT OUTER JOIN [dbo].[isir_convert_data] C ON A.[student_ssn] = C.[ssn] AND B.award_year_token = C.award_year_token
--LEFT OUTER JOIN [user_string] E ON B.[stu_award_year_token] = E.[stu_award_year_token]
--WHERE B.AWARD_YEAR_TOKEN = 2018  --For 18-19 year.
WHERE B.AWARD_YEAR_TOKEN = 2017  --For 17-18 year.
  AND C.processed_status ='B'
  AND C.date_processed = (SELECT MAX (X.date_processed)
               FROM isir_convert_data X 
               WHERE C.ssn = X.ssn)
FOR XML PATH('Student'), ROOT('CommonImport')

由于引号处理不当,因此无法使用该输出。看起来如下:

<CommonImport xmlns:CommonImport="CommonImport StudentRecordCount=&quot;1&quot; xsi:schemaLocation=&quot;http://collegeboard.org/CommonImport CommonImport.xsd&quot; xmlns=&quot;http://collegeboard.org/CommonImport&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;">

我是通过SQL Server生成的。您可以提供有关如何正确创建XML标签的任何建议吗?如果我没有正确使用XMLNAMESPACE函数,请告诉我。感谢您的考虑。

Shnugo

您必须区分

  • 命名空间的声明和
  • 命名空间的用法

在我看来,这StudentRecordCount应该是<CommonImport>节点中的一个属性,与相同schemaLocation第二个属性位于xmlns:xsi-namespace中。

您没有说明预期的输出,但是我的魔幻水晶球告诉我,您可能需要这样做:

WITH XMLNAMESPACES (DEFAULT 'http://collegeboard.org/CommonImport'
                  ,'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT 1 AS [@StudentRecordCount]
      ,'http://collegeboard.org/CommonImport CommonImport.xsd' AS [@xsi:schemaLocation]
      ,'SomeOtherData' AS [Student/SomeElement]
FOR XML PATH('CommonImport');

结果

<CommonImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xmlns="http://collegeboard.org/CommonImport" 
              StudentRecordCount="1" 
              xsi:schemaLocation="http://collegeboard.org/CommonImport CommonImport.xsd">
  <Student>
    <SomeElement>SomeOtherData</SomeElement>
  </Student>
</CommonImport>

如果这还不够帮助,请阅读有关如何创建MCVE以及提供示例数据和预期输出的信息。

更新1

大致上,这是您所需要的,但是名称空间是重复的。这是一个已知的烦人的问题。没错,结果是完全可以的,但是会肿。

WITH XMLNAMESPACES (DEFAULT 'http://collegeboard.org/CommonImport'
                  ,'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
,cte AS
(
    SELECT object_id,name FROM sys.objects
)
SELECT COUNT(*) AS [@RecordCount]
      ,'http://collegeboard.org/CommonImport CommonImport.xsd' AS [@xsi:schemaLocation] 
      ,(
        SELECT *
        FROM cte
        FOR XML PATH('Object'),TYPE
       )
FROM cte
FOR XML PATH('CommonImport'); 

更新2

丑陋的解决方法

WITH cte AS
(
    SELECT object_id,name FROM sys.objects
)
SELECT 
CAST(REPLACE(REPLACE(REPLACE(CAST(
(
    SELECT COUNT(*) AS [@RecordCount]
          ,'http://collegeboard.org/CommonImport CommonImport.xsd' AS [@xsi_schemaLocation] --<-- "xsi:" is replaced with "xsi_"
          ,'http://collegeboard.org/CommonImport' AS [@_xmlns_] --<-- "xmlns" is not allowed
          ,'http://www.w3.org/2001/XMLSchema-instance' AS [@_xmlns_xsi] --<-- Same with "xmlns:xsi"
          ,(
            SELECT *
            FROM cte
            FOR XML PATH('Object'),TYPE
           )
    FROM cte
    FOR XML PATH('CommonImport'),TYPE) AS nvarchar(MAX)),'xsi_','xsi:'),'_xmlns_',' xmlns'),'xmlnsxsi','xmlns:xsi') AS XML);

另外,您可能会创建一个完全没有名称空间的东西,并在最后添加带有字符串方法的名称空间声明。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

由于缺少 = string 的引号,无法验证 html

由于语法错误,我无法创建SQL表

PL/SQL - 由于我的功能无法创建包

正则表达式由于单引号和双引号无法正常工作

由于我们有模板文字(反引号),在任何情况下JavaScript仍需要单引号或双引号吗?

由于VssAccessControl无法安装Microsoft SQL Server

由于错误,SQL查询无法正常工作

由于单引号无法将字符串插入数据库

由于数字附近的引号,因此无法运行node.js mysql查询

由于双引号,无法更新 postgres 数据库中的字典列?

字词字段-由于引号/语音标记,IF语句无法按预期工作

Spring Boot + Cucumber 测试:由于 JSON 中的双引号转义,cucumber 无法检测我的步骤定义方法

由于字符串中的单引号或双引号,导致SQL语法错误

无法推送至git:由于某些原因,git认为我是其他用户

如何在SQL中转义单引号,从而导致“引号字符串未正确终止”?

当我在PHP for SQL Management Studio中使用单引号时如何添加单引号

在SQL中,我们在哪里使用反引号和引号?

减少由于错误而在SQL表中创建的数据

如何在Ansible中用美元引号创建SQL视图?

Gradle:由于没有正确的权限而无法运行SQL脚本?

由于无效的SQL Cloud配置,云运行无法启动

由于出现错误,SQL查询无法在phpMyAdmin上运行

SSIS SQL“由于潜在的数据丢失,无法转换该值。”

由于SQL语法错误,Gammu无法启动服务

缺少属性引号的SQL Server解析(格式错误)XML

SQL Server-批量插入-FIELDQUOTE无法识别双引号

无法使用PHP使用引号更新SQL数据库

在SQL中串联的字符串变量(用于访问DB),由于引号引起的语法错误?

由于计算列,Azure SQL Server空间索引错误无法创建...