stored procedure - SQL/NoSQL - Programmation
Marsh Posté le 23-08-2012 à 09:27:11
voila ce que j'ai essayE de faire(pour vous donner une idee):
DROP PROCEDURE ma_table
CREATE PROCEDURE ma_table
@id int OUTPUT,
@guid UNIQUEIDENTIFIER OUTPUT,
@name varchar(120) ,
@hr numeric(17,6) ,
@date datetime
AS
BEGIN
SET NOCOUNT ON
SET @id = @@IDENTITY
SET @guid = NEWID()
INSERT INTO table
(
id,
name,
hour,
date,
guid
)
VALUES
(
@id + 1,
@name,
@hour,
@date ,
@guid
)
END
GO
Marsh Posté le 23-08-2012 à 11:41:22
Dans la définition de ta table ajoute IDENTITY(1,1) pour ton ID, comme ca tu auras ton ID automatique.
Pour le reste tu peux faire comme ca:
CREATE PROCEDURE ma_table
@name varchar(120) ,
@hr numeric(17,6) ,
@date datetime
as
INSERT table (name, hour, date, guid)
VALUES (@name, @hr, @date, NEWID())
GO
Les infos pour IDENTITY: http://msdn.microsoft.com/en-us/li [...] 90%29.aspx
Marsh Posté le 23-08-2012 à 12:23:23
Mais il y aun hic Olii :s
En faite je ne peux pas modifier ma table et ajouter IDENTITY(1,1) pour l' ID
Marsh Posté le 24-08-2012 à 08:29:06
Tu ne peux pas a cause d'un probleme technique ou a cause d'un autre probleme?
Sinon tu ne peux pas utiliser @@identity pour generer l'ID, ca ne te retourne que la derniere valeur IDENTITY (qui sera null ici vu que tu n'as pas de colonne IDENTITY(x,x))
Le moyen rapide et pas super est de faire un Select MAX(ID) FROM table pour avoir le dernier ID et de faire un +1.
Ca ne fonctionne plus si tu as deux personne qui lancent la procedure en meme temps (il y a une chance qu'ils aient la meme ID)
Donc il faut gerer des locks sur la table pour empecher les inserts, ce qui reduit la vitesse en bloquant tout le monde.
M'enfin, tu vois que c'est beaucoup de problemes pour pas grand chose, si la raison poru la quelle tu ne peux pas ajouter IDENTITY(1,1) a ta table est a cause d'une décision de structure de la DB tu peux expliquer en quoi c'est une mauvais idée de s'en passer.
Une autre facon qui fonctionne toujours est de simuler la facon dont IDENTITY(1,1) fonctionne:
Tu crées une autre table avec les colonnes TableName et LastID et tu utilises cette query pour recevoir un ID qui sera unique sans bloquer personne:
UPDATE TABLE MonAutreTable
Set LastID = LastID + 1
OUTPUT inserted.LastID
Where TableName = 'ma_table'
Il faut initialiser la table la premiere fois, tu mets une ID assez grande pour ne pas avoir de confilit avec la table actuelle.
Il faut que toute les procedures qui font des insert dans la table utilisent cette technique ou tu pourrais avoir des problemes de duplicate key (vu que LastID ne sera plus synchro avec la ma_table).
Marsh Posté le 22-08-2012 à 20:36:50
Bonjour!
Voilà je veux cree une procedure stockée qui ajoute une ligne dans ma_table
cette ligne comporte une colonne guid, une colonne table_id et une colonne name
je veux que ca me génère automatiquement le guid et l'id comme je ne peux pas les entrée et sont uniques dans ma base de données.
Quelqu'un pourrait me guider sur ce sujet?? please