C# 通过SQL游标兼容性问题提取XML节点值

C# 通过SQL游标兼容性问题提取XML节点值,c#,xml,sql-server-2008,xquery,sql-server-2014,C#,Xml,Sql Server 2008,Xquery,Sql Server 2014,我有一个从C函数接受XMLdocument的存储过程。XML文件的输出示例如下所示: <roots> <root> <AnalyteCode>CCBILID </AnalyteCode> <InstrumentID>1483</InstrumentID> <IsSD>1</IsSD> <IsSEM>0</IsSEM> <Le

我有一个从C函数接受XMLdocument的存储过程。XML文件的输出示例如下所示:

<roots>
  <root>
    <AnalyteCode>CCBILID   </AnalyteCode>
    <InstrumentID>1483</InstrumentID>
    <IsSD>1</IsSD>
    <IsSEM>0</IsSEM>
    <Level1IntraPrecision>3.00</Level1IntraPrecision>
    <Level2IntraPrecision>5.00</Level2IntraPrecision>
    <Level3IntraPrecision>6.00</Level3IntraPrecision>
    <IsUpdated>1</IsUpdated>
  </root>
</roots>
问题是,此代码与我的开发环境SSMS 2014版完美配合,但是在部署到当前使用SSMS 2008 R2的服务器时,XML提取突出显示了以下错误:

找不到列选项卡或用户定义的函数或聚合tab.col.value,或者名称不明确

我附上了两张图片——一张是2014年SSMS的“无错误”图片,另一张是2008年SSMS上显示的上述错误图片


当然,解决该问题的最简单方法可能是将部署SSM更新到2014年,但这是不可能的。是否有人知道为什么会存在此兼容性问题和/或可以建议一个合适的替代方案来执行相同的操作?如果有人对此束手无策,我们将不胜感激

代码在执行时是否确实给出了该错误?SSMS在语法突出显示方面给出的错误无关紧要;重要的是服务器如何执行代码。感谢您返回@Jeroen。SP可以成功创建/更改,但是在SP执行期间,会按如下方式引发SqlException-选择失败,因为以下设置选项的设置不正确:“ANSI_NULLS,QUOTED_IDENTIFIER”。验证集合选项是否正确用于索引视图和/或计算列上的索引和/或筛选索引和/或查询通知和/或XML数据类型方法和/或空间索引操作。您创建的过程是错误的,然后。添加设置ANSI_空值;在上设置带引号的\u标识符;请在创建过程之前重试。这些选项是在创建存储过程时锁定的,而不是在执行存储过程时锁定的。我从来没有想过要寻找它!!非常感谢,在这方面节省了更多的时间。另一方面,经过进一步调查,Visual Studio schema compare似乎颠倒了分配给上述两个属性的值,即在更新期间,它将ANSI_NULLS和QUOTED_IDENTIFER关闭。这可能是一个错误,但一个可能的原因是,您的数据库在服务器之间对这些选项使用的默认值不同。在ManagementStudio中,检查数据库属性,然后选择选项。您应该在True上启用ANSI NULL,在True上启用带引号的标识符。即使应用程序真的应该自己设置这些选项,这样默认值就不重要了,但它们仍然经常这样做。代码在执行时真的给出了错误吗?SSMS在语法突出显示方面给出的错误无关紧要;重要的是服务器如何执行代码。感谢您返回@Jeroen。SP可以成功创建/更改,但是在SP执行期间,会按如下方式引发SqlException-选择失败,因为以下设置选项的设置不正确:“ANSI_NULLS,QUOTED_IDENTIFIER”。验证集合选项是否正确用于索引视图和/或计算列上的索引和/或筛选索引和/或查询通知和/或XML数据类型方法和/或空间索引操作。您创建的过程是错误的,然后。添加设置ANSI_空值;在上设置带引号的\u标识符;请在创建过程之前重试。这些选项是在创建存储过程时锁定的,而不是在执行存储过程时锁定的。我从来没有想过要寻找它!!非常感谢,在这方面节省了更多的时间。另一方面,经过进一步调查,Visual Studio schema compare似乎颠倒了分配给上述两个属性的值,即在更新期间,它将ANSI_NULLS和QUOTED_IDENTIFER关闭。这可能是一个错误,但一个可能的原因是,您的数据库在服务器之间对这些选项使用的默认值不同。在ManagementStudio中,检查数据库属性,然后选择选项。您应该在True上启用ANSI NULL,在True上启用带引号的标识符。即使应用程序真的应该自己设置这些选项,这样默认值就不重要了,但它们仍然经常这样做。
ALTER PROCEDURE [dbo].[RDX_SaveUncertaintyMeasurementReportOptions] 
@OptionsXml XML,
@ParticipantID INT
WITH EXECUTE AS CALLER
AS
BEGIN

  SET NOCOUNT ON;
  SET NUMERIC_ROUNDABORT OFF 
  SET ARITHABORT OFF

-- variables used to cursor through all XML nodes
DECLARE @id INT, -- id of any existing report options
      @analyte_code NCHAR(10), 
      @instrument_id INT, 
      @is_sd BIT,
      @is_sem BIT,
      @level_1_intra NUMERIC(10, 4),
      @level_2_intra NUMERIC(10, 4),
      @level_3_intra NUMERIC(10, 4);

-- setup cursor over all nodes within XML file
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT tab.col.value('AnalyteCode[1]','NCHAR(10)') as analyte_code,
      tab.col.value('InstrumentID[1]','INT') as instrument_id,
      tab.col.value('IsSD[1]','BIT') as is_sd,
      tab.col.value('IsSEM[1]','BIT') as is_sem,
      tab.col.value('Level1IntraPrecision[1]','NUMERIC(10, 4)') as level_1_intra,
      tab.col.value('Level2IntraPrecision[1]','NUMERIC(10, 4)') as level_2_intra,
      tab.col.value('Level3IntraPrecision[1]','NUMERIC(10, 4)') as level_3_intra
 FROM @OptionsXml.nodes('/roots/root') AS tab(col)

 OPEN cur

FETCH 
 NEXT 
 FROM cur

INTO @analyte_code, 
      @instrument_id, 
      @is_sd, 
      @is_sem, 
      @level_1_intra, 
      @level_2_intra, 
      @level_3_intra

WHILE @@FETCH_STATUS = 0
BEGIN

-- Update/insert code would be here, replaced with selects for testing
SELECT @analyte_code, 
@instrument_id, 
@is_sd, 
@is_sem, 
@level_1_intra, 
@level_2_intra, 
@level_3_intra
END

CLOSE cur;

DEALLOCATE cur;
END