如何编写动态 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
我有一个包含预算项目的预算 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