用存储过程保存父表和子表的数据如何处理,父表中的一条记录对应子表中的多条记录,如果没直接的解决办法,有什么变通的办法!
---------------------------------------------------------------
insert into 父表(ID,filedA,fieldB,fieldC)values(1,mhw,abdc,eefd)
insert into 子表(ID,fieldA,fieldC,fieldE)values(1,mhw,BBBB,adfs)
insert into 子表(ID,fieldA,fieldC,fieldE)values(2,mhw,CCCC,sdfas)
ID如果是自增列,那么如果你还是想维护的话改成:
set identity_insert 父表 on
insert into 父表(ID,filedA,fieldB,fieldC)values(1,mhw,abdc,eefd)
set identity_insert 父表 off
set identity_insert 子表 on
insert into 子表(ID,fieldA,fieldC,fieldE)values(1,mhw,BBBB,adfs)
insert into 子表(ID,fieldA,fieldC,fieldE)values(2,mhw,CCCC,sdfas)
set identity_insert 子表 off
如果想让系统自己来维护:
insert into 父表(filedA,fieldB,fieldC)values(mhw,abdc,eefd)
insert into 子表(fieldA,fieldC,fieldE)values(mhw,BBBB,adfs)
insert into 子表(fieldA,fieldC,fieldE)values(mhw,CCCC,sdfas)
---------------------------------------------------------------
/******************************************************************************
参照以下例子使用本存储过程:.
declare @xml nvarchar(4000)
set @xml =
'
1<d_user>
2<t_user>
3<f_autoid>1</f_autoid>
4<f_username>2</f_username>
5<f_password>1</f_password>
6<f_popedomvalue>1</f_popedomvalue>
7<f_usefulstate>1</f_usefulstate>
8</t_user>
9<d_userdetail>
10<t_userdetail>
11<f_autoid>1</f_autoid>
12<f_userautoid>2</f_userautoid>
13<f_usergroupautoid>1</f_usergroupautoid>
14</t_userdetail>
15</d_userdetail>
16</d_user>
'
exec S_User_Add @xml
select * from T_User
*******************************************************************************/
CREATE PROCEDURE S_User_Add
(
@xml nvarchar(4000)
)
AS
DECLARE @ReturnValue int --操作成功时返回值
DECLARE @idoc int -- xml doc 相当于文件的句柄
DECLARE @UserAutoID int --用户自动编号
-- 解析 xml 内容到一个句柄中
EXEC sp_xml_preparedocument @idoc output, @xml
SET NOCOUNT ON
DECLARE @CurrentError int --错误信息
-- 启动事务处理
BEGIN TRANSACTION
-- 新增用户信息到用户表中。
Insert into T_User
Select
F_UserName,
F_Password,
F_PopedomValue,
F_UsefulState
FROM OpenXML(@idoc, 'D_User/T_User', 2)
WITH T_User
--取得操作影响的记录数及错误信息
Select @ReturnValue=@@RowCount,@CurrentError = @@Error
-- 检查错误信息
IF @CurrentError != 0
BEGIN
GOTO ERROR_HANDLER
END
-- 得到新增主信息的自动编号
SELECT @UserAutoID = @@IDENTITY
-- 用户所在的用户组信息到用户明细表中。
Insert into T_UserDetail
Select
@UserAutoID,
F_UserGroupAutoID
FROM OpenXML(@idoc, 'D_User/T_UserDetail', 2)
WITH T_UserDetail
--取得操作影响的记录数及错误信息
Select @ReturnValue=@@RowCount,@CurrentError = @@Error
-- 检查错误信息
IF @CurrentError != 0
BEGIN
GOTO ERROR_HANDLER
END
-- 提交事务。
COMMIT TRANSACTION
SET NOCOUNT OFF
-- 关闭xml句柄。
EXEC sp_xml_removedocument @idoc
-- 成功,返回所影响的行数。
RETURN @ReturnValue
-- 出错处理。回滚事务,返回0
ERROR_HANDLER:
ROLLBACK TRANSACTION
EXEC sp_xml_removedocument @idoc
SET NOCOUNT OFF
RETURN -1