2013-05-10 2 views
4

J'ai un peu de difficulté avec celui-ci en ce sens que je ne suis pas sûr de savoir comment le faire dans SQL Server.Sortie dernière valeur de clé primaire insérée à partir de la procédure stockée

Fondamentalement, je veux insérer une nouvelle ligne dans la base de données, obtenir la valeur de PK qui vient d'être inséré (même requête) et exportez le résultat à tout appelé la procédure stockée:

CREATE PROCEDURE Users_Insert 
    -- Add the parameters for the stored procedure here 
    @userid int output, 
    @name varchar(50), 
    @surname varchar(50), 
    @email varchar(200), 
    @password varchar(50), 
    @location varchar(50) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    insert into Users(FirstName, LastName, Email, Password, Location) 
    values(@name, @surname, @email, @password, @location); 
    GO 
    @userid = @@IDENTITY; 
END 

J'ai fait dans MySQL comme suit:

CREATE PROCEDURE Users_Insert(@userid int output, @name varchar(50), @surname varchar(50), @email varchar(200), @password varchar(50), @location varchar(50) 
BEGIN 

    insert into Users(FirstName, LastName, Email, Password, Location) 
    values(@name, @surname, @email, @password, @location); 

    set @userid = last_insert_id(); 
END 

SQL Server me donne une erreur:

Msg 102, Level 15, State 1, Procedure Users_Insert, Line 18
Incorrect syntax near '@userid'.

Fra nkly, je ne suis pas sûr que j'ai déclaré le paramètre de sortie correctement, quelqu'un peut-il offrir des suggestions?

+0

Sélectionnez SELECT @ userid = SCOPE_IDENTITY(); et enlever aller n'est pas nécessaire. –

+2

marc_s n'aime pas mon typage paresseux: P – Ortund

Répondre

10

Vous devez affecter la valeur à @userid! De plus, je vous conseille d'utiliser SCOPE_IDENTITY() et non @@IDENTITY:

CREATE PROCEDURE Users_Insert 
    -- Add the parameters for the stored procedure here 
    @userid int output, 
    @name varchar(50), 
    @surname varchar(50), 
    @email varchar(200), 
    @password varchar(50), 
    @location varchar(50) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    insert into Users(FirstName, LastName, Email, Password, Location) 
    values(@name, @surname, @email, @password, @location); 

    -- make an actual **assignment** here... 
    SELECT @userid = SCOPE_IDENTITY(); 
END 

See this blog post for an explanation as to WHY you should use SCOPE_IDENTITY over @@IDENTITY

+0

ce qui n'allait pas avec mon affectation la façon dont je le faisais? – Ortund

+1

@Ortund: vous n'aviez ** aucune affectation ** - vous venez d'avoir '@userid = ...' - pas de mot clé 'SET' ou' SELECT' –

+0

'Doit déclarer le varialbe scalaire" @userid "' ... à chaque fois Je suis sur sql server, tout est juste des problèmes, problèmes, problèmes ... c'est pourquoi je suis passé à mysql> _> – Ortund

Questions connexes