USE CIQ_Declare
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
create procedure [dbo].[spImDeclareAuditOut]
@ImDeclareOutStr  nvarchar(600)AS
BEGINdeclare @docHandle int
set @ImDeclareOutStr =cast(@ImDeclareOutStr as nvarchar(200)) 
SET @ImDeclareOutStr=REPLACE(@ImDeclareOutStr,'<?xml version=''1.0''  encoding=''GBK''?>','')EXEC sp_xml_preparedocument @docHandle OUTPUT, @ImDeclareOutStr
--Get UserID 
declare @declare_id uniqueidentifier
select @declare_id = (select [DECLARE_ID] 
from openxml(@docHandle,N'//IMPORT_DECLARE',2) with (DECLARE_ID uniqueidentifier))--Get Declare State
declare @state int
select @state = (select [DECLARE_STATE] from openxml (@docHandle,N'//IMPORT_DECLARE',2) with (DECLARE_STATE int))update CIQ_I_E_Declare
set DECLARE_STATE = @state
where DECLARE_ID = @declare_id
update DeclareResult
set 
DECLARE_STATE = @state,
QUAR_OFFICER = (select [QUAR_OFFICER] 
from openxml (@docHandle,N'//IMPORT_DECLARE',2)
with (QUAR_OFFICER nvarchar(50))), AUDITING_PERSON = (select [AUDITING_PERSON]
from openxml (@docHandle,N'//IMPORT_DECLARE',2)
with (AUDITING_PERSON nvarchar(50))), AUDITING_DATE = (select [AUDITING_DATE] 
from openxml (@docHandle,N'//IMPORT_DECLARE',2)
with (AUDITING_DATE datetime)), BACK_REASON = (select [BACK_REASON]
from openxml (@docHandle,N'//IMPORT_DECLARE',2)
with (BACK_REASON nvarchar(400))) 
where DECLARE_ID = @declare_idEXEC sp_xml_removedocument @docHandle
SELECT '数据成功插入' as 'Success' FOR XML PATH(''),BINARY BASE64,TYPE
END 
GO
执行语句
exec [spImDeclareAuditOut] 
'<root><header><process_result>s</process_result><info>操作成功</info></header><body><IMPORT_DECLARE><DECLARE_ID>5FE39D89FEAE1A54E0400A0A6E594D3F</DECLARE_ID><DECLARE_STATE>8</DECLARE_STATE><QUAR_OFFICER>赵立忠</QUAR_OFFICER><AUDITING_PERSON>teda</AUDITING_PERSON><AUDITING_DATE>2009-01-07 00:00:00.0</AUDITING_DATE><BACK_REASON>asdf</BACK_REASON></IMPORT_DECLARE></body></root>'
然后它报错
XML 文本 "" 附近的行号 0 处出现 XML 分析错误 0xc00ce553。
消息 6602,级别 16,状态 2,过程 sp_xml_preparedocument,第 1 行
错误说明是 '下列标记没有被关闭: root, body, IMPORT_DECLARE, QUAR_OFFICER。'。
消息 8179,级别 16,状态 5,过程 spImDeclareAuditOut,第 21 行
找不到句柄为 0 的预定义语句。
消息 8179,级别 16,状态 5,过程 spImDeclareAuditOut,第 26 行
找不到句柄为 0 的预定义语句。什么回事呢?

解决方案 »

  1.   

    ??看錯誤,看上去像是產生的xml存在未閉合的東東
      

  2.   

    你測試下進行到哪步出的BUG啊
    應該就是根據你輸入的XML,對
    CIQ_I_E_Declare
    DeclareResult
    做update動作吧。給個表結構看看?
      

  3.   


    对阿.. .下面是xml<root>
    <header>
    <process_result>s</process_result>
    <info>操作成功</info>
    </header>
    <body>
    <IMPORT_DECLARE>
    <DECLARE_ID>5FE39D89FEAE1A54E0400A0A6E594D3F</DECLARE_ID>
    <DECLARE_STATE>8</DECLARE_STATE>
    <QUAR_OFFICER>赵立忠</QUAR_OFFICER>
    <AUDITING_PERSON>teda</AUDITING_PERSON>
    <AUDITING_DATE>2009-01-07 00:00:00.0</AUDITING_DATE>
    <BACK_REASON></BACK_REASON>
    </IMPORT_DECLARE>
    </body>
    </root>表结构
    TABLE [dbo].[DeclareResult](
    [id] [int] NULL,
    [DECLARE_ID] [varchar](36) NULL,
    [GeneralDeclID] [int] NULL,
    [DECLARE_STATE] [int] NULL,
    [QUAR_OFFICER] [nvarchar](50) NULL,
    [AUDITING_PERSON] [nvarchar](50) NULL,
    [AUDITING_DATE] [datetime] NULL,
    [BACK_REASON] [nvarchar](400) NULL
      

  4.   

    create procedure [dbo].[spImDeclareAuditOut]
    @ImDeclareOutStr  nvarchar(600)AS
    BEGINdeclare @docHandle int
    set @ImDeclareOutStr =cast(@ImDeclareOutStr as nvarchar(200)
    是这里的长度不够