sql - 插入查询通过 select 和 output 子句在表中插入多行。 SQL Server 2008

标签 sql sql-server transactions

我创建了一个存储过程(请忽略语法错误)

alter proc usp_newServerDetails
   (@appid int, @envid int, @serType varchar(20), @servName varchar(20))
as
    declare @oTbl_sd table (ID int)
    declare @outID1
    declare @oTbl_cd table (ID int)
    declare @outID2

    begin Transaction
        insert into server_details(envid, servertype, servername)
        output inserted.serverid into @oTbl_sd(ID)
        values(@envid, @serType, @servName)

        select @outID1 = ID from @oTbl_sd

        insert into configdetails(serverid, servertype, configpath, configtype)
        output inserted.configid into @oTbl_cd(ID)
        (select @outID1, cm.servertype, cm.configpath, cm.configtype 
         from configpthmaster cm 
         where cm.appid = @appid )

        select @outID2 = ID from @oTbl_cd

        insert into configkeydetails(confiid, keyname)
        output inserted.Keyid into @oTbl_ckd(ID)
        (select @outID2, cm.key 
         from configpthmaster cm 
         where cm.appid = @appid)

    begin 
    commit
    end

server_details 表有一个身份列 ID ,它是自动生成的,即。 @outID1 并且第一个插入查询仅插入 1 行。

configpthmaster 表不与任何其他表直接相关,并且有 2 个唯一的数据行,我想在插入过程中获取这些数据以将数据一一插入到其他表中。

第二个插入查询从configpthmaster表中获取数据 并在生成(自动生成)ID 时在 configdetails 中插入 2 行,即。 @outID2

它还有一个映射到 server_details 的 FK。

问题是“@outID2”仅给出最后插入的ID(即,如果两个id生成100,101,我得到101),最终在第三次插入时,仅插入具有相同id 101的2行,但我希望插入应该是线性的。即一个代表 100,另一个代表 101。

如果插入时影响零行如何回滚事务?

我怎样才能达到这些要求?请帮忙。

最佳答案

按如下方式更改您的程序,然后重试。

ALTER PROCEDURE usp_newServerDetails(@appid int, @envid int,@serType varchar(20),@servName varchar(20))
    AS
BEGIN
  BEGIN TRY

   DECLARE @Output TABLE (ID int,TableName VARCHAR(50),cmKey VARCHAR(50)) --table variable for keeping Inserted ID's

        BEGIN TRAN


         IF EXISTS ( SELECT 1 FROM configpthmaster cm  WHERE cm.appid = @appid ) 
                        AND  ( SELECT 1 FROM configkeydetails ck  WHERE ck.appid = @appid ) --add a conditon to satisfy the valid insertions

         BEGIN

            INSERT INTO server_detials(envid,servertype,servername)
                OUTPUT inserted.serverid,'server_detials',NULL INTO @Output(ID,TableName,cmKey )
            VALUES(@envid ,@serType ,@servName)

            INSERT INTO configdetails(serverid,servertype,configpath,configtype)
                OUTPUT inserted.configid,'configdetails',cm.Key INTO @Output(ID,TableName,cmKey )
            SELECT t.ID,cm.servertype,cm.configpath,cm.configtype 
            FROM configpthmaster cm 
              CROSS APPLY (SELECT ID FROM @Output WHERE TableName='server_detials')t
            WHERE cm.appid = @appid

            INSERT INTO configkeydetails(configId,keyname)
            SELECT ID,cmKey FROM @Output 
            WHERE TableName='configdetails'

        END

       COMMIT TRAN
  END TRY

    BEGIN CATCH

        IF @@TRANCOUNT > 0 
        ROLLBACK 

    END CATCH

END

关于sql - 插入查询通过 select 和 output 子句在表中插入多行。 SQL Server 2008,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39911483/

相关文章:

SQL Server 过滤索引 - 谁能解释我看到的这个错误?

python - 通过 python informixdb 寻找 informix 的 SQL 插入语法

sql - REGEXP 错误 - 在预期条件的上下文中指定的非 bool 类型的表达式,接近 'REGEXP'

sql - 更新 SQL 中的主键列名称

sql - 使用 CFQUERYPARAM 在 SQL 中指定表/列名称

c# - 返回 SqlDataReader

sql-server - 检查约束以确认 Exactly One 不为 NULL

sql - 为什么即使更新语句失败,此 SQL Server 事务仍会提交

c# - C# 中的事务

PHP-MySQL-如何安全地增加 MySQL 整数字段?