使用一个语句使用增量日期更新SQL中的列表?

时间:2012-01-05 15:37:45

标签: sql-server tsql

我正在编写一个更新语句,我需要使用增量日期一次更新所有项目列表。增量值是用户定义的。我找到了一个与http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx的需求非常类似的示例,但不知道如何实现它。那个例子是:

DECLARE @counter int
SET @counter = 0
UPDATE #tmp_Users
SET @counter = counter = @counter + 1

我目前的陈述是:

strSQL.CommandText = "Update tblItem set item_timed_close=convert(datetime, @item_timed_close),item_timed_start=convert(money, case when item_est_lo < 500 then ((convert(int,item_est_lo+25)/50)*50) when item_est_lo < 1000 then ((convert(int,item_est_lo+50)/100)*100) when item_est_lo < 3000 then ((convert(int,item_est_lo+125)/250)*250) when item_est_lo < 5000 then ((convert(int,item_est_lo+250)/500)*500) else ((convert(int,item_est_lo+12.5)/25)*25) end ) Where item_sale_id=@item_sale_id";
  strSQL.Parameters.Add(new SqlParameter("@item_timed_close", SqlDbType.VarChar, 100, ParameterDirection.Input, true, 0, 0, "item_timed_close", DataRowVersion.Current, datetime_Var.AddMinutes(minutes_Var += Increments_var)));
  strSQL.Parameters.Add(new SqlParameter("@item_sale_id", SqlDbType.VarChar, 100, ParameterDirection.Input, true, 0, 0, "item_sale_id", DataRowVersion.Current, itemSaleId3_Var));

datetime_Var是用户定义的,是DateTime格式。 minutes_Var等于零开始。 Increments_var是用户定义的。无论item_timed_close设置为什么,我都需要Increments_var递增。

修改

我正在寻找的结果将是这样的:

用户指定的开始日期为2012-01-08 12:00:00 PM,增量为{​​{1}}秒。对于更新的每一行,日期将如下所示:

10

第一个日期甚至可以为我们所关心的所有人增加已增加的值,只要它递增即可。我可以通过代码更改初始开始日期。

更新

根据Naval的建议,我尝试了一个子查询。首先,我将所有日期字段设置为NULL。然后,我运行以下查询:

2012-01-08 12:00:00 PM
2012-01-08 12:00:10 PM
2012-01-08 12:00:20 PM
2012-01-08 12:00:30 PM
2012-01-08 12:00:40 PM
2012-01-08 12:00:50 PM
2012-01-08 12:01:00 PM
2012-01-08 12:01:10 PM
2012-01-08 12:01:20 PM

我希望我可以将子查询乘以传入的变量,但它没有按预期工作。对于每个字段,似乎将 strSQL3.CommandText = "Update tblItem set item_timed_close=DATEADD(minute,((Select count(*) as Count From tblItem Where item_sale_id=@item_sale_id And item_timed_close Is NULL) * @increment),convert(datetime, @item_timed_close)),item_timed_start=convert(money, case when item_est_lo < 500 then ((convert(int,item_est_lo+25)/50)*50) when item_est_lo < 1000 then ((convert(int,item_est_lo+50)/100)*100) when item_est_lo < 3000 then ((convert(int,item_est_lo+125)/250)*250) when item_est_lo < 5000 then ((convert(int,item_est_lo+250)/500)*500) else ((convert(int,item_est_lo+12.5)/25)*25) end ) Where item_sale_id=@item_sale_id"; strSQL3.Parameters.Add(new SqlParameter("@item_timed_close", SqlDbType.VarChar, 100, ParameterDirection.Input, true, 0, 0, "item_timed_close", DataRowVersion.Current, datetime_Var)); strSQL3.Parameters.Add(new SqlParameter("@item_sale_id", SqlDbType.Int, 5, ParameterDirection.Input, true, 0, 0, "item_sale_id", DataRowVersion.Current, itemSaleId3_Var)); strSQL3.Parameters.Add(new SqlParameter("@increment", SqlDbType.Int, 5, ParameterDirection.Input, true, 0, 0, "increment", DataRowVersion.Current, Increments_var)); 乘以1。我单独运行select语句,它返回471.所以我知道该部分正常工作。我是否需要将@increment转换为整数或其他内容?

完成

我终于明白了。我最初应该想到这个......我必须在更新字符串的常规Count序列中更改计数器变量。这是我的工作查询。

Set

所以我使用了我找到的原始示例,然后取出了最后一个 Declare @auto Int Set @auto = 0 Update tblItem set item_timed_close = DATEADD(minute, (@auto * @increment), convert(datetime, @item_timed_close)) , item_timed_start = convert(money, case when item_est_lo < 500 then ((convert(int, item_est_lo+25)/50)*50) when item_est_lo < 1000 then ((convert(int, item_est_lo+50)/100)*100) when item_est_lo < 3000 then ((convert(int, item_est_lo+125)/250)*250) when item_est_lo < 5000 then ((convert(int, item_est_lo+250)/500)*500) else ((convert(int,item_est_lo+12.5)/25)*25) end ) , @auto = (@auto + 1) Where item_sale_id=@item_sale_id 部分并将其放入更新字符串的Set @counter参数中。

3 个答案:

答案 0 :(得分:1)

strSQL.Parameters.Add(不是进行递增逻辑的地方。根据示例,尝试将其用于更新语句。首先为Increments_Var添加另一个参数,并在update语句中使用DATEADD将其添加到@item_timed_close,同时将@item_timed_close更新为新的总和。我建议从使用样本和日期而不是整数的简单开始,然后从那里开始构建。

答案 1 :(得分:1)

试试这个:...我正在编写一个查询,你将其转换为数据库格式。

  

更新TableName设置DateD = DateAdd('MI',(ID * 10),'01-Jan-2011 00:00:00')

ID列是您的身份字段(AutoIncrement)ID * 10 =将其乘以10以获得不同的日期时间。

我认为这会奏效:)

小心:)

答案 2 :(得分:1)

我终于明白了。我最初应该想到这个......我必须在更新字符串的常规Set序列中更改计数器变量。这是我的工作查询。

 Declare @auto Int Set @auto = 0 Update tblItem set item_timed_close=DATEADD(minute,(@auto * @increment),convert(datetime, @item_timed_close)),item_timed_start=convert(money, case when item_est_lo < 500 then ((convert(int,item_est_lo+25)/50)*50) when item_est_lo < 1000 then ((convert(int,item_est_lo+50)/100)*100) when item_est_lo < 3000 then ((convert(int,item_est_lo+125)/250)*250) when item_est_lo < 5000 then ((convert(int,item_est_lo+250)/500)*500) else ((convert(int,item_est_lo+12.5)/25)*25) end ),@auto = (@auto + 1) Where item_sale_id=@item_sale_id

所以我使用了我找到的原始示例,然后取出了最后一个Set @counter部分并将其放入更新字符串的set参数中。