Sql server 从存储过程中的插入调用存储过程

Sql server 从存储过程中的插入调用存储过程,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在尝试创建一个存储过程MS SQL Server 2012,它复制多个行,然后将它们插入到同一个表中,并与另一个外部表关联。在复制的行上,我们还更改UpdateDate和createddate,以及创建和更新这些新插入行的用户 这一切都很好,直到我们找到主键。该数据库是Sage CRM的数据库-它使用存储过程eware\u get\u identity\u id为我们插入的表获取下一个主键id。这个软件获取标识存储过程对其他表执行各种插入、更新和删除操作,因此我们不能使用函数。我们无法更改数

我正在尝试创建一个存储过程MS SQL Server 2012,它复制多个行,然后将它们插入到同一个表中,并与另一个外部表关联。在复制的行上,我们还更改UpdateDate和createddate,以及创建和更新这些新插入行的用户

这一切都很好,直到我们找到主键。该数据库是Sage CRM的数据库-它使用存储过程eware\u get\u identity\u id为我们插入的表获取下一个主键id。这个软件获取标识存储过程对其他表执行各种插入、更新和删除操作,因此我们不能使用函数。我们无法更改数据库的组成,因此也不能将列的类型更改为标识规范

我想做但我知道我做不到的事情如下:

ALTER PROCEDURE Lead_CopySecuritiesToOpp
    @lead_leadID int,
    @oppo_opportunityID int,
    @user_userID int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    INSERT INTO Security
            (<columns hidden for clarity>,secu_CreatedDate,secu_UpdatedDate,secu_CreatedBy,secu_UpdatedBy, 
                         secu_LeadId, secu_CaseId,secu_SecurityID)
    SELECT  <columns hidden for clarity>, GETDATE() as secu_CreatedDate, GETDATE() as secu_UpdatedDate, @user_userID as secu_CreatedBy, 
             @user_userID as secu_UpdatedBy, NULL as secu_LeadId, @oppo_opportunityID as secu_CaseId,
             (exec [dbo].[eware_get_identity_id] 'Security') as secu_SecurityID
        FROM            Security
        WHERE        (secu_LeadId = @lead_leadID)

END
GO

显然,我无法以这种方式内联执行存储过程,exec[dbo]。[eware\u get\u identity\u id]“Security”作为secu\u SecurityID。如果Sage SP不更改数据,那么函数将是理想的,但它确实更改了数据,因此这不是一个选项。有人能提出更好的方法吗?我确实考虑过使用游标,或者在插入之前使用临时表来获取数据?请给我一些建议。

我最后用一个光标来执行每一行的SP。一次只能执行一到两行,所以这个解决方案即使不是很漂亮也可以工作

ALTER PROCEDURE Lead_CopySecuritiesToOppo
    -- Add the parameters for the stored procedure here
    @lead_leadID int,
    @oppo_opportunityID int,
    @user_userID int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @secu_SecurityID char( 11 )
    declare @newsecu_SecurityID int

    set rowcount 0
    select * into #mytemp from Security where secu_LeadId = @lead_leadID

    set rowcount 1

    select @secu_SecurityID = secu_SecurityID from #mytemp

    --Cursor through all the returned security rows
    while @@rowcount <> 0
    begin
        set rowcount 0

        --Get the next ID
        EXEC @newsecu_SecurityID = [dbo].[eware_get_identity_id] 'Security'

        --Insert this row into the security table
        INSERT INTO Security
                        (secu_TimeStamp, secu_Deleted, secu_Secterr, secu_Name, 
                         secu_Status, secu_propType, secu_typeN, secu_noBeds, secu_noFloors, secu_noFlats, secu_purpBuilt, secu_stanConst, 
                         secu_stanConstN, secu_yearBuilt, secu_tenure, secu_leaseLeft, secu_exLEA, secu_exLEAN, secu_adjComP, secu_adjComPN, secu_letToFam, 
                         secu_letToFamN, secu_tenType, secu_purPrice, secu_purPrice_CID, secu_purchasedDate, secu_estValue, secu_estValue_CID, secu_reinstval, 
                         secu_reinstval_CID, secu_rentInc, secu_rentInc_CID, secu_valCont, secu_valTel, secu_loanType, secu_address1, secu_address2, secu_address3, 
                         secu_address4, secu_postcode, secu_primary,secu_CreatedDate,secu_UpdatedDate,secu_CreatedBy,secu_UpdatedBy, 
                             secu_LeadId, secu_CaseId,secu_SecurityID)
        SELECT              secu_TimeStamp, secu_Deleted, secu_Secterr, secu_Name, 
                             secu_Status, secu_propType, secu_typeN, secu_noBeds, secu_noFloors, secu_noFlats, secu_purpBuilt, secu_stanConst, 
                             secu_stanConstN, secu_yearBuilt, secu_tenure, secu_leaseLeft, secu_exLEA, secu_exLEAN, secu_adjComP, secu_adjComPN, secu_letToFam, 
                             secu_letToFamN, secu_tenType, secu_purPrice, secu_purPrice_CID, secu_purchasedDate, secu_estValue, secu_estValue_CID, secu_reinstval, 
                             secu_reinstval_CID, secu_rentInc, secu_rentInc_CID, secu_valCont, secu_valTel, secu_loanType, secu_address1, secu_address2, secu_address3, 
                             secu_address4, secu_postcode, secu_primary, GETDATE() as secu_CreatedDate, GETDATE() as secu_UpdatedDate, @user_userID as secu_CreatedBy, 
                             @user_userID as secu_UpdatedBy, NULL as secu_LeadId, @oppo_opportunityID as secu_CaseId, @newsecu_SecurityID as secu_SecurityID
        FROM            #mytemp where secu_SecurityID = @secu_SecurityID

        delete #mytemp where secu_SecurityID = @secu_SecurityID

        set rowcount 1
        select @secu_SecurityID = secu_SecurityID from #mytemp
    end
    set rowcount 0

END
GO

你考虑过让它成为交易性的吗?假设您只是调用执行插入/更新等操作的存储过程,您应该能够将整个操作包装到事务中,并在出现任何错误时回滚。然后,您可以安全地调用identity generate函数并将其作为两个单独的语句插入,而不会出现数据库不一致的情况。如果您无法更改数据库的组成,那么如何创建/更改此Lead_CopySecurities ToApp存储过程?有什么东西可以更改/添加到数据库中吗?嗯,你有没有看过一个叫做“电子钱包”\u get\u identity\u id\u range的东西?它看起来是为了解决这个问题而写的。请看这里:,这篇文章提到它已经走了一半了…@rbaryyoung,Lead_CopySecurities ToApp是我自己的SP,我可以创建新的SP,只是不能更改现有的系统SP或表。我将查看该SQL,看看它是否有帮助。助教