Mettre à jour une list dans SQL avec des dates incrémentales en utilisant une instruction?

J'écris une déclaration de mise à jour où j'ai besoin de mettre à jour une list d'articles tout à la fois avec des dates incrémentales. La valeur incrémentielle est définie par l'user. J'ai trouvé un exemple assez similaire à mes besoins sur http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx , mais je ne sais pas comment je l'implémenterais. Cet exemple est:

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

Ma déclaration actuelle est:

 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 est défini par l'user et est un format DateTime . minutes_Var est égal à zéro pour commencer. Increments_var est défini par l'user. J'ai besoin de item_timed_close pour incrémenter quel que soit le item_timed_close increments_var.

MODIFIER

Les résultats que je cherche seraient quelque chose comme ceci:

L'user spécifie une date de début de 2012-01-08 12:00:00 PM et un incrément de 10 secondes. Pour chaque ligne mise à jour, la date ressemblerait à:

 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 

La première date pourrait même avoir la valeur incrémentée déjà ajoutée pour tout ce qui nous intéresse, tant qu'elle augmente. Je pourrais changer la date de début initiale avec cela en tête grâce au code.

Mettre à jour

Avec la suggestion de Naval, j'ai essayé une sous-requête. Tout d'abord, je définis tous les champs de date sur NULL. Ensuite, j'exécute la requête suivante:

  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)); 

J'espérais pouvoir multiplier la sous-requête par la variable transmise, mais cela ne fonctionnait pas comme prévu. Il semble multiplier le @increment par 1 pour chaque domaine. J'ai exécuté l'instruction select seul et il renvoie 471. Donc je sais que cette partie fonctionne correctement. Ai-je besoin de lancer Count comme un integer ou quelque chose?

TERMINÉ

J'ai finalement compris. J'aurais dû y penser au début … J'ai dû changer la variable du countur dans la séquence Set habituelle de ma string de mise à jour. Voici ma requête de travail.

  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 

J'ai donc utilisé l'exemple original que j'avais trouvé, et j'ai juste sorti la dernière partie Set @counter et l'ai mise dans les parameters set la string de set jour.

strSQL.Parameters.Add( n'est pas l'endroit pour faire la logique d'incrémentation.Selon l'exemple, essayez de travailler dans votre instruction de mise à DATEADD abord un autre paramètre pour Increments_Var et utilisez DATEADD dans votre instruction update pour l'append à votre @item_timed_close tout en mettant à jour @item_timed_close à la nouvelle sum, je suggère de commencer par quelque chose de simple qui utilise l'échantillon et les dates au lieu des entiers, puis de build à partir de là.

Essayez ceci: … j'écris une requête, vous le convertissez au format de votre database.

Mettre à jour TableName Définir DateD = DateAdd ('MI', (ID * 10), '01-Jan-2011 00:00:00')

La colonne ID correspond à votre champ d'identité (AutoIncrement) ID * 10 = multiplié par 10 pour get une date / heure différente.

Je pense que cela fonctionnera 🙂

Prends soin:)

J'ai finalement compris. J'aurais dû y penser au début … J'ai dû changer la variable du countur dans la séquence Set habituelle de ma string de mise à jour. Voici ma requête de travail.

  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 

J'ai donc utilisé l'exemple original que j'avais trouvé, et j'ai juste sorti la dernière partie Set @counter et l'ai mise dans les parameters set la string de set jour.