[英]XML to NVarchar(MAX) failing
我有一个存储过程,该过程返回2个结果集,每个结果集都包含一个单元格。 在第一个中,我返回一个xml,第二个中返回一个datetime值。
我尝试从链接服务器访问此SP(SP_XML),但失败,提示链接服务器上不允许XML。 所以我写了一个包装器(SP_NChar),如下所示。 问题是我只需要跨链接服务器的XML结果集,而不需要datetime结果集(无论是否收到它都没关系)
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
它可以在我的开发环境上按预期工作,但在生产环境下却无法工作,任何想法都可能出问题。
仅用于测试目的SP_XML
CREATE procedure SP_XML
as
BEGIN
select CAST('<ROOT>2</ROOT>' AS XML)
select getdate()
END
尝试像这样修改您的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中,您尝试返回datetime,但无法将其转换为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.