Procedimiento almacenado con identidad de entrada de alcance de salida

Tengo dos tablas, concretamente User and UserRole, donde deseo pasar los valores a través de procedimientos almacenados con las tablas siguientes. Necesito ayuda sobre cómo puedo crear un procedimiento que se inserte en ambas tablas, asumiendo que un usuario tiene solo un rol, es decir, Usuario o Administrador.

El parámetro Id insertado en la segunda tabla debe ser el Id de la tabla de usuario. Por favor sugiéreme

CREATE TABLE [dbo].[User](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Username] [nvarchar](50) NULL,
    [Password] [nvarchar](50) NULL,
)
CREATE TABLE [dbo].[UserRole](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserId] [int] Foreign Key References User(ID)NOT NULL,
    [Role] [nvarchar](50) NULL
)

CREATE PROCEDURE [dbo].[AddUserRole]
    @Name      VARCHAR(50),
    @Username DATETIME,
    @Password      INT,
    @Role NVARCHAR(50),
     @Id INT OUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [WH].[dbo].[User]
                (
                Name,
                Username,
                Password
                )
    VALUES  
                (
                @ Name, 
                @Username,
                 @Password
                );

    SET @ Id = SCOPE_IDENTITY();

INSERT INTO [WH].[dbo].[UserRole]
                (
                UserId,
                Role
                )
    VALUES  
                (
                @Id, 
                @ Role
                );
END;
0
¿Su consulta actualmente no funciona?
agregado el autor Alex, fuente
¿Su consulta actualmente no funciona?
agregado el autor Alex, fuente
Definir "no funciona". ¿Recibes un mensaje de error? ¿Tu SP se completa pero los registros no están insertados? Puedo ver que tienes algunos errores menores, por ejemplo. "@ Role" (espacio bwteen @ y Role)
agregado el autor Alex, fuente
Definir "no funciona". ¿Recibes un mensaje de error? ¿Tu SP se completa pero los registros no están insertados? Puedo ver que tienes algunos errores menores, por ejemplo. "@ Role" (espacio bwteen @ y Role)
agregado el autor Alex, fuente
agregado el autor Esperento57, fuente
Creo que no estás usando mi código actualizado que he editado. Inténtalo de nuevo.
agregado el autor gulshan arora, fuente
Creo que no estás usando mi código actualizado que he editado. Inténtalo de nuevo.
agregado el autor gulshan arora, fuente
Creo que no estás usando mi código actualizado que he editado. Inténtalo de nuevo.
agregado el autor gulshan arora, fuente
@Alex no está funcionando. Estoy intentando.
agregado el autor Ashok Bhattarai, fuente
@Alex no está funcionando. Estoy intentando.
agregado el autor Ashok Bhattarai, fuente
@Alex, estoy siguiendo la respuesta de gulson arora, pero no funciona con un mensaje de error mientras lo llamo desde C# me sale el Procedimiento o la función 'TempAddUserRole' espera el parámetro '@Id', que no se proporcionó.
agregado el autor Ashok Bhattarai, fuente

6 Respuestas

Use output method, detail here

prueba algo como esto

DECLARE @MyTableVar table( Id int);  

INSERT INTO [WH].[dbo].[User] (Name, Username, Password)
OUTPUT INSERTED.Id  INTO @MyTableVar
VALUES  (@Name, @Username, @Password);


INSERT INTO [WH].[dbo].[UserRole] (UserId, Role )
SELECT Id, @Role FROM @MyTableVar;
2
agregado

Use output method, detail here

prueba algo como esto

DECLARE @MyTableVar table( Id int);  

INSERT INTO [WH].[dbo].[User] (Name, Username, Password)
OUTPUT INSERTED.Id  INTO @MyTableVar
VALUES  (@Name, @Username, @Password);


INSERT INTO [WH].[dbo].[UserRole] (UserId, Role )
SELECT Id, @Role FROM @MyTableVar;
2
agregado

Use output method, detail here

prueba algo como esto

DECLARE @MyTableVar table( Id int);  

INSERT INTO [WH].[dbo].[User] (Name, Username, Password)
OUTPUT INSERTED.Id  INTO @MyTableVar
VALUES  (@Name, @Username, @Password);


INSERT INTO [WH].[dbo].[UserRole] (UserId, Role )
SELECT Id, @Role FROM @MyTableVar;
2
agregado

enter image description hereNow this working fine !

        CREATE TABLE [dbo].[TempUser](
        [Id] [int] IDENTITY(1,1) NOT NULL Primary key,
        [Name] [nvarchar](50) NULL,
        [Username] [nvarchar](50) NULL,
        [Password] [nvarchar](50) NULL,
    )
    CREATE TABLE [dbo].[TempUserRole](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [UserId] [int] Foreign Key References TempUser(ID)NOT NULL,
        [Role] [nvarchar](50) NULL
    )
    --ALTER TABLE TempAddUserRole DROP CONSTRAINT FK__TempUserR__UserI__503293D2;



EXEC TempAddUserRole 'Gulshan','12 sep 2018','1','Admin'
EXEC TempAddUserRole 'Gulshan','12 sep 2018','1','Admin',


ALTER PROCEDURE [dbo].[TempAddUserRole]
    @Name      VARCHAR(50),
    @Username DATETIME,
    @Password      INT,
    @Role NVARCHAR(50)

AS
BEGIN
    SET NOCOUNT ON;

     declare @Id INT 


    INSERT INTO [TempUser]
                (
                Name,
                Username,
                Password
                )
    VALUES  
                (
                @Name, 
                @Username,
                 @Password
                );

    SET @Id = SCOPE_IDENTITY();

INSERT INTO [TempUserRole]
                (
                UserId,
                Role
                )
    VALUES  
                (
                @Id, 
                @Role
                );
END;
1
agregado
Me refiero a declarar @Id dentro del procedimiento no en el parámetro. Espero que esto funcione para usted
agregado el autor gulshan arora, fuente
He eliminado @Id del parámetro y está funcionando según su requerimiento. Corre ahora
agregado el autor gulshan arora, fuente
Entonces debe eliminarlo, es del parámetro y declarar en el procedimiento o debe proporcionar.
agregado el autor gulshan arora, fuente
Muchas gracias por su ayuda. Está trabajando ahora.
agregado el autor Ashok Bhattarai, fuente
Debe declarar la variable escalar a los campos restantes, en el editor del servidor SQL
agregado el autor Ashok Bhattarai, fuente
La identidad de identificación de la primera tabla debe pasarse a la segunda tabla UserId, debe estar sone al mismo tiempo.
agregado el autor Ashok Bhattarai, fuente
El procedimiento o la función 'TempAddUserRole' espera el parámetro '@Id', que no se suministró, ya que el ID ES IDENTIDAD TENGO QUE Suministrarlo.
agregado el autor Ashok Bhattarai, fuente

enter image description hereNow this working fine !

        CREATE TABLE [dbo].[TempUser](
        [Id] [int] IDENTITY(1,1) NOT NULL Primary key,
        [Name] [nvarchar](50) NULL,
        [Username] [nvarchar](50) NULL,
        [Password] [nvarchar](50) NULL,
    )
    CREATE TABLE [dbo].[TempUserRole](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [UserId] [int] Foreign Key References TempUser(ID)NOT NULL,
        [Role] [nvarchar](50) NULL
    )
    --ALTER TABLE TempAddUserRole DROP CONSTRAINT FK__TempUserR__UserI__503293D2;



EXEC TempAddUserRole 'Gulshan','12 sep 2018','1','Admin'
EXEC TempAddUserRole 'Gulshan','12 sep 2018','1','Admin',


ALTER PROCEDURE [dbo].[TempAddUserRole]
    @Name      VARCHAR(50),
    @Username DATETIME,
    @Password      INT,
    @Role NVARCHAR(50)

AS
BEGIN
    SET NOCOUNT ON;

     declare @Id INT 


    INSERT INTO [TempUser]
                (
                Name,
                Username,
                Password
                )
    VALUES  
                (
                @Name, 
                @Username,
                 @Password
                );

    SET @Id = SCOPE_IDENTITY();

INSERT INTO [TempUserRole]
                (
                UserId,
                Role
                )
    VALUES  
                (
                @Id, 
                @Role
                );
END;
1
agregado
Me refiero a declarar @Id dentro del procedimiento no en el parámetro. Espero que esto funcione para usted
agregado el autor gulshan arora, fuente
He eliminado @Id del parámetro y está funcionando según su requerimiento. Corre ahora
agregado el autor gulshan arora, fuente
Entonces debe eliminarlo, es del parámetro y declarar en el procedimiento o debe proporcionar.
agregado el autor gulshan arora, fuente
Debe declarar la variable escalar a los campos restantes, en el editor del servidor SQL
agregado el autor Ashok Bhattarai, fuente
Muchas gracias por su ayuda. Está trabajando ahora.
agregado el autor Ashok Bhattarai, fuente
La identidad de identificación de la primera tabla debe pasarse a la segunda tabla UserId, debe estar sone al mismo tiempo.
agregado el autor Ashok Bhattarai, fuente
El procedimiento o la función 'TempAddUserRole' espera el parámetro '@Id', que no se suministró, ya que el ID ES IDENTIDAD TENGO QUE Suministrarlo.
agregado el autor Ashok Bhattarai, fuente

enter image description hereNow this working fine !

        CREATE TABLE [dbo].[TempUser](
        [Id] [int] IDENTITY(1,1) NOT NULL Primary key,
        [Name] [nvarchar](50) NULL,
        [Username] [nvarchar](50) NULL,
        [Password] [nvarchar](50) NULL,
    )
    CREATE TABLE [dbo].[TempUserRole](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [UserId] [int] Foreign Key References TempUser(ID)NOT NULL,
        [Role] [nvarchar](50) NULL
    )
    --ALTER TABLE TempAddUserRole DROP CONSTRAINT FK__TempUserR__UserI__503293D2;



EXEC TempAddUserRole 'Gulshan','12 sep 2018','1','Admin'
EXEC TempAddUserRole 'Gulshan','12 sep 2018','1','Admin',


ALTER PROCEDURE [dbo].[TempAddUserRole]
    @Name      VARCHAR(50),
    @Username DATETIME,
    @Password      INT,
    @Role NVARCHAR(50)

AS
BEGIN
    SET NOCOUNT ON;

     declare @Id INT 


    INSERT INTO [TempUser]
                (
                Name,
                Username,
                Password
                )
    VALUES  
                (
                @Name, 
                @Username,
                 @Password
                );

    SET @Id = SCOPE_IDENTITY();

INSERT INTO [TempUserRole]
                (
                UserId,
                Role
                )
    VALUES  
                (
                @Id, 
                @Role
                );
END;
1
agregado
Entonces debe eliminarlo, es del parámetro y declarar en el procedimiento o debe proporcionar.
agregado el autor gulshan arora, fuente
Me refiero a declarar @Id dentro del procedimiento no en el parámetro. Espero que esto funcione para usted
agregado el autor gulshan arora, fuente
He eliminado @Id del parámetro y está funcionando según su requerimiento. Corre ahora
agregado el autor gulshan arora, fuente
Muchas gracias por su ayuda. Está trabajando ahora.
agregado el autor Ashok Bhattarai, fuente
Debe declarar la variable escalar a los campos restantes, en el editor del servidor SQL
agregado el autor Ashok Bhattarai, fuente
El procedimiento o la función 'TempAddUserRole' espera el parámetro '@Id', que no se suministró, ya que el ID ES IDENTIDAD TENGO QUE Suministrarlo.
agregado el autor Ashok Bhattarai, fuente
La identidad de identificación de la primera tabla debe pasarse a la segunda tabla UserId, debe estar sone al mismo tiempo.
agregado el autor Ashok Bhattarai, fuente