如何编写动态 SQL 查询以使用适当的 MasterLevelId 从 table 复制项目

How to write dynamic SQL Query to copy items from table with proper MasterLevelId

我有一个包含预算项目的预算 table。每个项目都有 na ID(自动增量)、BudgetId、BudgetItemLevel(某种级别结构)、BudgetItemCode(不唯一)、BudgetItemName(不唯一)、BudgetItemMasterID(连接到上级 BudgetItem)、BudgetItemValue、BudgetItemStatus 和一些 DateTime 值,如下所示...

每个预算都可以有自定义的级别数(BudgetId=1 -> 2 级;BudgetId=2 -> 3 级等等...)。 BudgetItemMasterId = NULL 的 BudgetItems 是顶级项目...

我需要做的是复制预算及其项目(与原始值完全相同),将 BudgetId 值传递给 StoredProcedure。这里困难的部分是为新的 copied 预算项目

获取正确的 BudgetMasterId

例子

如果我复制 BudgetId = 1,新预算应如下所示:

好的,假设您将 BudgetID 1 传递给存储过程。我会创建一个循环来处理顶级项目。所以让我们使用 ID 号 1。为此创建一行,因为它是顶级的,并将 ID 放在一个变量中。循环遍历预算 ID 为 1 且 budgetmasterid 等于 ID 1 的所有内容并创建这些行并为它们提供您创建的新顶级项目的 budgetmasterid。

DECLARE @identity int
DECLARE @tempId int
DECLARE @tempMasterId int

SELECT @identity = @@IDENTITY
IF(@identity > 0)


Declare @MasterID int
DECLARE MasterIDs CURSOR LOCAL FOR (select Id from T_BudgetCharts where BudgetId = @BudgetId )
OPEN MasterIDs
FETCH NEXT FROM BudgetIds into @MasterID

WHILE @@FETCH_STATUS = 0
BEGIN

IF((Select [BudgetItemMasterID] from T_BudgetCharts where [Id] = @MasterID)is not null)
INSERT INTO T_BudgetCharts([BudgetId],[BudgetItemLevel],[BudgetItemCode],[BudgetItemName],[BudgetItemMasterID],[BudgetItemBudegtValue],[BugedtItemStatus], [BugedtIdOriginal], [MasterIdOriginal],[sysDateTimeCreated],[sysDateTimeModified])
SELECT @identity,[BudgetItemLevel],[BudgetItemCode],[BudgetItemName],[BudgetItemMasterID],[BudgetItemBudegtValue],[BugedtItemStatus], [ID],[BudgetItemMasterID], GETDATE(),GETDATE()
FROM T_BudgetCharts
WHERE [Id] = @MasterID
Declare @NewMasterID int
set @NewMasterID = @@IDENTITY

INSERT INTO T_BudgetCharts([BudgetId],[BudgetItemLevel],[BudgetItemCode],[BudgetItemName],[BudgetItemMasterID],[BudgetItemBudegtValue],[BugedtItemStatus], [BugedtIdOriginal], [MasterIdOriginal],[sysDateTimeCreated],[sysDateTimeModified])
SELECT @identity,[BudgetItemLevel],[BudgetItemCode],       [BudgetItemName],@NewMasterID,[BudgetItemBudegtValue],[BugedtItemStatus], [ID],            [BudgetItemMasterID], GETDATE(),GETDATE()
FROM T_BudgetCharts
Where [BudgetItemMasterID] = @MasterID
END
END

所以,这是最终的、功能齐全的 sp。谢谢大家的帮助...

CREATE PROCEDURE [dbo].[sp_CopyBudgetByBudgetId] 
@BudgetId int
AS
BEGIN
            DECLARE @identity int
            DECLARE @tempId int
            DECLARE @tempValue int

            INSERT INTO T_Budget ([BudgetName],[BudgetMaxLevel],[BudgetCurrency],[BudgetStatus],[BudgetAppliedToDonor],[sysDateTimeCreated],[sysDateTimeModified])
            SELECT [BudgetName],[BudgetMaxLevel],[BudgetCurrency],1,0,GETDATE(),GETDATE()
            FROM T_Budget
            WHERE ID = @BudgetId

            SELECT @identity= @@IDENTITY

            IF(@identity > 0)
            BEGIN
                    INSERT INTO T_BudgetCharts2([BudgetId],[BudgetItemLevel],[BudgetItemCode],[BudgetItemName],[BudgetItemMasterID],[BudgetItemBudegtValue],[BugedtItemStatus], [BugedtIdOriginal], [MasterIdOriginal],[sysDateTimeCreated],[sysDateTimeModified])
                    SELECT @identity,[BudgetItemLevel],[BudgetItemCode],[BudgetItemName],[BudgetItemMasterID],[BudgetItemBudegtValue],[BugedtItemStatus], [ID],[BudgetItemMasterID], GETDATE(),GETDATE()
                    FROM T_BudgetCharts2
                    WHERE BudgetId = @BudgetId

                    Declare @ID int
                    DECLARE IDs CURSOR LOCAL FOR (select ID from T_BudgetCharts2 where BudgetId = @identity)

                    OPEN IDs
                    FETCH NEXT FROM IDs into @ID

                    WHILE @@FETCH_STATUS = 0
                    BEGIN
                            If (Select MasterIdOriginal From T_BudgetCharts2 Where ID = @ID) IS NOT NULL
                                BEGIN
                                SET @tempId = (Select MasterIdOriginal From T_BudgetCharts2 Where ID = @ID)
                                SET @tempValue = (Select ID FROM T_BudgetCharts2 WHERE BugedtIdOriginal = @tempId) 
                                Update T_BudgetCharts2 SET BudgetItemMasterId = @tempValue WHERE ID = @ID
                            END
                            FETCH NEXT FROM IDs into @ID
                    END

                    CLOSE IDs
                    DEALLOCATE IDs
            END
END