2012-01-05 27 views
2

我正在寫更新聲明,我需要用增量日期一次更新所有項目列表。增量值是用戶定義的。我在http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx發現了一個與我的需求非常相似的示例,但不知道如何實現它。這例子是:使用一條語句在SQL中用增量日期更新列表?

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 [email protected]_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是用戶定義的。無論Increments_var設置爲什麼,我都需要item_timed_close來遞增。

編輯

結果我找了會是這樣的:

用戶指定的2012-01-08 12:00:00 PM起始日期和10秒的增量。對於每一行更新,日期將如下所示:

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 

第一次約會甚至已經加入到它的所有我們關心的增加值,只要它遞增。我可以通過代碼改變最初的開始日期。

更新

與海軍的建議下,我嘗試了子查詢。首先,我將所有日期字段設置爲NULL。然後,我運行以下查詢:

 strSQL3.CommandText = "Update tblItem set item_timed_close=DATEADD(minute,((Select count(*) as Count From tblItem Where [email protected]_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 [email protected]_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)); 

我希望我可以在傳遞的變量乘以子查詢,但如預期沒有奏效。它似乎將每個字段的@increment乘以1。我已經單獨運行select語句,它返回471.所以我知道該部分正常工作。我是否需要將Count作爲整數或其他東西?

DONE

我終於得到它。我應該首先想到這一點....我必須改變我的更新字符串的常規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 [email protected]_sale_id 

所以我用我找到了原來的例子,只是拿出最後Set @counter部分並將它放入我的更新字符串的set參數。

+0

你寫的查詢看起來有瑕疵......它運行正確嗎? – Naval 2012-01-05 17:22:04

+0

@Naval是的,它是正確運行的。我只需要它也按照用戶指定的分鐘數遞增日期。 – James 2012-01-05 17:45:01

回答

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 [email protected]_sale_id 

所以我用我找到了原來的例子,只是拿出最後Set @counter部分並將它放入我的更新字符串的set參數。

1

strSQL.Parameters.Add(不是做增量邏輯的地方。根據示例,嘗試將其應用到更新聲明中。首先在更新語句中爲Increments_Var添加另一個參數,並在更新語句中使用DATEADD將其添加到@item_timed_close中,同時將@item_timed_close更新爲新和。我建議從簡單的東西開始,使用樣本和日期而不是整數,然後從那裏開始構建。

+0

我不知道如何在單個語句中使用我的更新編寫示例,因爲'@'符號認爲它是一個新參數。我試着用它的方式把它放入我的代碼中,並且它什麼都不做,以增加日期。 – James 2012-01-05 16:12:41

1

試試這個:...我正在寫一個查詢,你把它轉換成你的數據庫格式。

更新表名設置日期爲=使用DateAdd( 'MI',(ID×10),01-JAN-2011 00:00:00')

ID列是你的身份場(自動增加)ID * 10 =乘以10得到不同的日期時間。

我認爲這會工作:)

保重:)

+0

但是這不是靜態的嗎?換句話說,對於每一個條目,「ID * 10」都是相同的東西?或者你認爲這個ID是一個表格字段?在這種情況下,ID將是由用戶指定的分鐘值(尚不在數據庫中)。 – James 2012-01-06 14:48:21

+0

ID將是自動遞增主鍵...它將是不同的和唯一的表 – Naval 2012-01-07 04:51:55

+0

但這並沒有幫助我需要做什麼。該表格也沒有任何自動增量字段。 – James 2012-01-07 16:08:15