Sql 使用参数迭代update语句
Sql 使用参数迭代update语句,sql,sql-server-2008,loops,Sql,Sql Server 2008,Loops,Tbl\u campaign\u details\u direct列出每个活动的参数(活动持续时间现在只是一个占位符) 我想将该表链接到tbl\u dim\u date(仅摘录): 为此,我想编写一个TSQL语句,根据tbl\u Campaign\u details\u direct中定义的日期范围(=“Campaign Start”和“Campaign Finish”)自动设置tbl\u dim\u date中的列“Campaign details directid” 这意味着对于2015
Tbl\u campaign\u details\u direct
列出每个活动的参数(活动持续时间现在只是一个占位符)
我想将该表链接到tbl\u dim\u date
(仅摘录):
为此,我想编写一个TSQL语句,根据tbl\u Campaign\u details\u direct
中定义的日期范围(=“Campaign Start”和“Campaign Finish”)自动设置tbl\u dim\u date
中的列“Campaign details directid”
这意味着对于20150609和20150617之间的所有DateID,列ActivityDetailsDirectID在tbl\u dim\u date
中应该得到一个“2”。
对于所有介于20151126和20151201之间的日期ID,在tbl\u dim\u date
中显示一个“1”
对于tbl_campaign_details_direct中的一条记录,我的TSQL如下所示:
Declare @start int, @finish int, @CampaignID int
Set @start = (select cast(replace(CampaignStart,'-','')as int) from [REPORTING].[dbo].[campaign_details_direct])
Set @finish = (select cast(replace(CampaignFinish,'-','')as int) from [REPORTING].[dbo].[campaign_details_direct])
While @start <= @finish
Begin
Update Reporting.dbo.dim_date
Set CampaignDetailsDirectID = 1 --How to adjust to set respective CampaignDetailsDirectID automatically = campaign_details_direct.CampaignDetailsID?
Where dim_date.DateID = @start
Set @start = @start + 1
End
Go -- How to iterate through all campaigns?
你不需要一个循环。连接表的简单更新将完成您想要的操作。但是,如果日期范围重叠,您希望发生什么?update语句是什么样子的?我似乎无法正确理解。。。到目前为止,与活动重叠的日期范围从未发生过。。。但是,如果发生这种情况,您建议我怎么做?您将如何组织这些表?这是我现在的尝试(请参见上文的编辑),但似乎@Min_activitid的值没有改变,因为只有黑色星期五的第一个日期范围更新为1。有什么明显的吗?查一下“理货表”和“数字表”。这种技术是在SQL中用(高效的)单个查询替换(低效的)循环的标准方法。还有@PieterGeerkens很酷的东西!老实说,我不知道如何把它应用到我的问题上。。在使用这种更有效的解决方案之前,我想先修复我的(低效的)循环构造,因为我现在可以忍受这种低效(相当小的数据集)。为什么循环不起作用?
Use [REPORTING]
Go
Declare @start int, @finish int, @MAX_CampaignID int, @MIN_CampaignID int
Set @MAX_CampaignID = (select max(CampaignDetailsID) from [REPORTING].[dbo].[campaign_details_direct])
Set @MIN_CampaignID = (select min(CampaignDetailsID) from [REPORTING].[dbo].[campaign_details_direct])
Set @start = (select cast(replace(CampaignStart,'-','')as int) from [REPORTING].[dbo].[campaign_details_direct] where CampaignDetailsID = @MIN_CampaignID)
Set @finish = (select cast(replace(CampaignFinish,'-','')as int) from [REPORTING].[dbo].[campaign_details_direct] where CampaignDetailsID = @MIN_CampaignID)
Select @start as start_date, @finish as end_date, @MAX_CampaignID as last_campaign_id, @MIN_CampaignID as first_campaign_id
While @MIN_CampaignID <= @MAX_CampaignID
Begin
While @start <= @finish
Begin
Update Reporting.dbo.dim_date Set CampaignDetailsDirectID = @MIN_CampaignID
Where dim_date.DateID = @start
Set @start = @start + 1
End
Set @MIN_CampaignID = @MIN_CampaignID + 1
End
Go