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.