我有一个存储过程,应该根据amount
的值在表中插入一些随机行
@amount1 INT --EligibilityID = 1
@amount2 INT --EligibilityID = 2
@amount3 INT --EligibilityID = 3
也许最明显的方法是使用TOP(@amount)
,但是数量值很多,第二个选择要大得多。因此,我一直在寻找一种在可能的情况下在单个语句中完成此操作的方法。
INSERT INTO [dbo].[CaseInfo]
SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
FROM (
SELECT TOP(@amount1) [EligibilityID],[CaseNumber],[CaseMonth]
FROM [dbo].[tempCases]
WHERE [EligibilityID] = 1
)
INSERT INTO [dbo].[CaseInfo]
SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
FROM (
SELECT TOP(@amount2) [EligibilityID],[CaseNumber],[CaseMonth]
FROM [dbo].[tempCases]
WHERE [EligibilityID] = 2
)
INSERT INTO [dbo].[CaseInfo]
SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
FROM (
SELECT TOP(@amount3) [EligibilityID],[CaseNumber],[CaseMonth]
FROM [dbo].[tempCases]
WHERE [EligibilityID] = 3
)
答案 0 :(得分:1)
我建议使用row_number,并按eligibilityID进行分区,然后将其与case语句进行比较,以每次都选择正确的变量:
INSERT INTO [dbo].[CaseInfo]
SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
FROM (
SELECT [EligibilityID],[CaseNumber],[CaseMonth]
,row_number() over (partition by EligibilityID order by CaseNumber) as rn -- you haven't mentioned an ORDER BY, you can change it here
FROM [dbo].[tempCases]
) as table1
where rn<=case
when EligibilityID=1 then @amount1
when EligibilityID=2 then @amount2
when EligibilityID=3 then @amount3
end