【问题标题】:XML to NVarchar(MAX) failingXML 到 NVarchar(MAX) 失败
【发布时间】:2014-07-07 16:25:27
【问题描述】:

我有一个存储过程,它返回 2 个结果集,每个结果集都包含一个单元格。在第一个中,我返回一个 xml,在第二个中返回一个日期时间值。

我尝试从链接服务器访问此 SP (SP_XML),但未能说明链接服务器上不允许使用 XML。所以我写了一个如下的包装器(SP_NChar)。问题是我只需要跨链接服务器的 XML 结果集,而不需要日期时间结果集(无论我是否收到它都没有关系)

CREATE PROCEDURE SP_NChar
AS  
BEGIN  
 -- TO STORE PROC RESULT
 DECLARE @XML_RESULT TABLE(result XML)  
 BEGIN TRY  

  INSERT INTO @XML_RESULT(result) EXEC SP_XML
  SELECT CAST(result AS NVARCHAR(MAX)) FROM @XML_RESULT   

 END TRY  
 BEGIN CATCH

  -- This block will get executed because one is XML and another is Datetime and it will fail in try part
  PRINT 'Do Nothing'  
  select * from @XML_RESULT  

 END CATCH  
END

它在我的开发环境中按预期工作,但在 prod 环境中失败,不知道可能出了什么问题。

此处仅用于测试目的 SP_XML

CREATE procedure SP_XML
as
BEGIN
    select CAST('<ROOT>2</ROOT>' AS XML)
    select getdate()
END

【问题讨论】:

    标签: sql xml procedure nvarchar


    【解决方案1】:

    尝试像这样修改您的 SP:

    CREATE PROCEDURE [dbo].[SP_NChar]
    AS  
    BEGIN  
     -- TO STORE PROC RESULT
        DECLARE @XML_RESULT TABLE(result XML)  
        BEGIN TRY  
            INSERT INTO @XML_RESULT(result) EXEC SP_XML
            SELECT CAST(result AS NVARCHAR(MAX)) FROM @XML_RESULT   
        END TRY  
        BEGIN CATCH
            DECLARE @ErrorMessage NVARCHAR(4000);
            DECLARE @ErrorSeverity INT;
            DECLARE @ErrorState INT;
            SELECT 
                @ErrorMessage = ERROR_MESSAGE() + '. В строке: ' + CAST(ERROR_LINE() AS NVARCHAR),
                @ErrorSeverity = ERROR_SEVERITY(),
                @ErrorState = ERROR_STATE();
    
            IF @@TRANCOUNT > 0
                ROLLBACK TRANSACTION;
    
            RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
            RETURN;
        END CATCH  
    END
    

    你会得到错误:

    Msg 50000, Level 16, State 2, Procedure SP_NChar, Line 28
    Operand type clash: datetime is incompatible with xml
    

    在 SP_XML 中,您尝试返回日期时间,但无法将其转换为 XML。我建议你像这样修改代码:

    CREATE PROCEDURE [dbo].[SP_XML]
    AS
    BEGIN
        SELECT CAST('<ROOT>2</ROOT>' AS XML)
        SELECT CAST('<date>' + CONVERT(nvarchar(MAX),getdate()) + '</date>' AS XML)
    END
    

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      相关资源
      最近更新 更多