我正在嘗試創建一個存儲過程(MS SQL Server 2012),該過程複製多個行,然後將它們插入同一個表中並將其關聯到不同的外部表。在複製的行上,我們還會更改updateddate和createddate以及創建和更新這些新插入行的用戶。在存儲過程中從插入調用存儲過程
這一切都很好,直到我們來到主鍵。數據庫是Sage CRM的數據庫 - 它使用存儲過程(eware_get_identity_id)爲我們插入的表獲取下一個主鍵ID。這eware_get_identity_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_get_identity_id]'Security')as secu_SecurityID)。如果Sage SP沒有更改數據,那麼它的功能是理想的,但它確實如此,所以這不是一個選項。任何人都可以提出一個更好的方式來做到這一點我曾考慮訴諸遊標,或者可能是臨時表來在插入前獲取數據?建議請。
你有沒有考慮過它是交易?假設你只是調用插入/更新等的sprocs,你應該能夠將整個操作包裝在一個事務中,並且回滾應該會出現任何問題。然後,您可以安全地調用身份生成函數並插入爲兩個單獨的語句,而不會出現數據庫不一致的情況,如果出現錯誤 – Charleh
如果您不能更改數據庫的組成,那麼如何創建/更改此Lead_CopySecuritiesToOpp'存儲過程?是否有一些內容可以*更改/添加到數據庫中? – RBarryYoung
嗯,你看過一個叫做'eware_get_identity_id_range'的東西嗎?看起來它是爲了解決這個問題而寫的。看到這裏:https://community.sagecrm.com/user_community/f/84/p/3205/10691.aspx#10691,後提提及它是一半左右... – RBarryYoung