2013-01-10 36 views
1

在Transact-SQL和存储过程中不那么强大。我想知道该过程在哪里保存数据?无法确定存储过程保存数据的位置

ALTER PROCEDURE [dbo].[InsurerCascoConditionsSave] 
    @InsurerID int 
    ,@Data xml 
AS 
BEGIN 

    declare @DocHandle int 
    EXEC sp_xml_preparedocument @DocHandle OUTPUT, @Data 

    MERGE InsurerCascoConditions AS target 
    USING (SELECT InsurerConditionID, @InsurerID, CascoConditionID, Value 
      FROM OPENXML (@DocHandle, '/DocumentElement/Table1', 2) 
      WITH (InsurerConditionID int, CascoConditionID int, Value nvarchar(max))) 
     AS source (InsurerConditionID, InsurerID, CascoConditionID, Value) 
    ON (target.ID = isnull(source.InsurerConditionID, 0)) 
    WHEN MATCHED THEN 
     UPDATE SET Value = source.Value 
    WHEN NOT MATCHED THEN 
     INSERT (InsurerID, CascoConditionID, Value) 
     VALUES (source.InsurerID, source.CascoConditionID, source.Value); 

    EXEC sp_xml_removedocument @DocHandle 
END 
+1

MERGE保险公司CAScoConditions AS **目标** –

回答

1

转至InsurerCascoConditions表。

这是通过MERGE声明完成的,你可以在MSDN上看到它。一般情况下,根据条件,它会生成INSERTUPDATEDELETE。它可以很容易从语法中读取。

+1

...和DELETE也是如此。 –

+0

好的...但是,为什么你不能选择数据表格表格(它返回0行..但是我知道必须有东西..) –

+0

@HamletHakobyan很明显是的,谢谢。 – psur

1

正如@psur所说,InsurerCascoConditions是将被修改的表格。 MERGE允许您将INSERT/UPDATE/DELETE作为单个语句的一部分,而不是执行3个单独的语句。

打破你的发言....

MERGE InsurerCascoConditions AS target - 此操作

USING这个目标表...... - 这是从那里数据被始发

ON .... - 定义源数据如何与目标数据相关(例如,与ID匹配)

WHEN MATCHED THEN UPDATE .... - 如果SOURCE中的记录匹配根据上述ON条件记录在TARGET中,这将定义匹配目标记录中的哪些字段,以更新匹配的源记录中的哪些字段

WHEN NOT MATCHED THEN INSERT .... - 如果源中的记录不是根据上述ON条件在TARGET中匹配一条记录,这会在目标表中插入一个新行

+0

感谢您的明确解释! –