Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用参数迭代update语句_Sql_Sql Server 2008_Loops - Fatal编程技术网

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