IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]------OPENXML和MERGE联合使用的方法--------

    fredrickhu发表于 2014-01-07 17:31:49
    love 0

    在这里我直接拿项目中的代码来说明问题。大家一下就看懂了。

    Use LvRui
    Go
    if object_ID('[cuGiftCatagroy]') is not null
    	Drop Procedure [cuGiftCatagroy]
    Go
    /****************************************************************************************************************************************************************
    %%存储过程名:cuGiftCatagroy 
    
    %%输入参数:
    exec cuGiftCatagroy
    '
    	16
    	
    	1	
    	A
    	1000
    	A
    	1
    	
    	    
    		1
    		
    		16
    		1
    		2
    		3
    		4
    		1	
    		1
    		
    	
    
    ',0,0
    %%输出参数:
    
    %%功能:新增记录在表Gift
    ****************************************************************************************************************************************************************
    %%编写:fredrickhu  
    ****************************************************************************************************************************************************************/
    CREATE PROCEDURE cuGiftCatagroy 
    		(@GiftCatagroy XML,@GiftCatagroyID INT=0 OUTPUT,@GiftCatagroySpecID INT=0 OUTPUT)
    AS
    SET NOCOUNT ON ;
    
    DECLARE @idoc INT,@NextNr INT,@IsCreate TINYINT,@Code VARCHAR(50)
    
    SELECT @NextNr=NextNr FROM NextSerialNr WHERE SerialNrTypeID=4
    
    SELECT @IsCreate=@GiftCatagroy.exist('GiftCatagroy[@Action=1]')
    
    BEGIN 
    IF @IsCreate=1
    BEGIN 
    	UPDATE NextSerialNr SET NextNr=NextNr+1 WHERE SerialNrTypeID=4
    	SET @Code='LP'+RIGHT(100+ROW_NUMBER()OVER(ORDER BY @NextNr)+@NextNr-1,2)
    END 
    ELSE 
    	SET @Code='LP'+RIGHT(100+@NextNr-1,2)
    END 
    
    EXEC sp_xml_preparedocument @idoc OUTPUT, @GiftCatagroy
    
    
    BEGIN TRY
    BEGIN TRAN
    
    --GiftCatagroy
    BEGIN 
    ;MERGE GiftCatagroy AS T
    USING
    (
    SELECT
    	[GiftClassID],[CName],@Code AS [Code],
    	[Remark],[DisplayOrder],Action
    FROM OPENXML (@idoc, '@GiftCatagroy[@Action!=0]',3)
    WITH 
    	(
    	[GiftClassID] SMALLINT 'GiftClassID[1]',
    	[GiftNr] varchar(50) 'GiftNr[1]',
    	[CName] nvarchar(50) 'CName[1]',
    	[Code] varchar(50) 'Code[1]',
    	[Remark] nvarchar(200) 'Remark[1]',
    	[DisplayOrder] smallint 'DisplayOrder[1]',
    	Action TINYINT '@Action')
    ) AS S ON (S.GiftClassID=T.GiftClassID)
    WHEN MATCHED AND S.Action=2   THEN 
    UPDATE SET /*GiftClassID=S.GiftClassID,*/[CName]=S.CName,[Code]=S.Code ,[Remark]=S.Remark ,[DisplayOrder]=S.DisplayOrder 
    WHEN NOT MATCHED AND S.Action=1 THEN
    INSERT 
    	([GiftClassID],[CName],[Code],[Remark],[DisplayOrder])
    VALUES
    	(S.GiftClassID,S.CName,S.Code,S.Remark,S.DisplayOrder);
    
    SET @GiftCatagroyID=SCOPE_IDENTITY()
    
    END 
    
    
    --GiftCatagroySpec
    BEGIN 
    ;MERGE GiftCatagroySpec AS T
    USING
    (
    SELECT 
    	[ID],GiftCatagroyID,SpecID,Mandatory,DisplayOrder,Action
    FROM OPENXML(@idoc, 'Gift/GiftCatagroySpecs/GiftCatagroySpec[@Action!=0]',3) 
    WITH 
    	(
    	[ID] INT 'ID[1]',
    	[GiftCatagroyID] INT '../../ID[1]',
    	[SpecID] smallint 'SpecID[1]',
    	[Mandatory] BIT 'Mandatory[1]',
    	[DisplayOrder] BIT 'DisaplayOrder[1]',
    	Action TINYINT '@Action')
    ) AS S ON S.ID=T.[ID]
    WHEN MATCHED AND S.Action=2  THEN
    UPDATE SET GiftCatagroyID=S.GiftCatagroyID,SpecID=S.SpecID,Mandatory=S.Mandatory,DisplayOrder=S.DisplayOrder
    WHEN NOT MATCHED AND S.Action=1 THEN
    INSERT 
    	( GiftCatagroyID,SpecID,Mandatory,DisplayOrder)
    VALUES  ( S.GiftCatagroyID,S.SpecID,S.Mandatory,S.DisplayOrder);
    
    SET @GiftCatagroySpecID=SCOPE_IDENTITY()
    
    END
    
     
    COMMIT TRAN
    
    END TRY
    BEGIN CATCH
    	DECLARE @Error NVARCHAR(200)
    	SET @Error=ERROR_MESSAGE()
    	RAISERROR 50001 @Error
    	ROLLBACK TRAN
    END CATCH
    
    EXEC sp_xml_removedocument @idoc
    
     
    Go
    




沪ICP备19023445号-2号
友情链接