SQL Server - Ayuda, Insertar con Procedimiento Almacenado

 
Vista:
sin imagen de perfil

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Dariel (25 intervenciones) el 19/11/2014 16:03:33
Tengo una duda a ver si pueden ayudarme, estoy creando un procedimiento almacenado, que inserte datos en varias tablas a la ves, esto no es problema, el problema me viene cuando inserto en las que estan relacionadas a esta(Cliente), que posee un ID Autoincrementado (Identity), y 3 de las tablas relacionadas a ella son datos pertemecientes al cliente tambien por lo tanto tienen el ID_Cliente pero no Autoincrementado, para insertarlo tengo que pasarlo yo, este es el problema, como se cual es el ID_Cliente que se esta generando para poderlo pasar como dato a las demas tablas, aca te madno el procedimiento para que lo vean, gracias por todo.
USE [db_Notarie]
GO
/**** Procedimiento Almacenado InsertarCliente ****/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[InsertarCliente]
/Valores del CLIENTE/
@ID_Cliente bigint,

@Nombre_Cliente varchar(50),
@OtroNombre_Cliente varchar(50),
@Apellidos_Cliente varchar(50),
@NoApartamento_Cliente varchar(50),
@NomComplejo_Cliente varchar(50),
@NumCompleOCasa_Cliente varchar(50),
@Rue_Cliente varchar(50),
@Quartier_Cliente varchar(50),
@Ville_Cliente varchar(50),
@Departament_Cliente varchar(50),
@Pays_Cliente varchar(50),
@CodePostal_Cliente varchar(50),
@ID_TipoCliente_Cliente int,
@Descripcion_Cliente varchar(50),

/Valores del Situacion Profecional/
@PosicionOcupa_SP varchar(50),
@Empleador_SP varchar(50),
@NomComplex_SP varchar(50),
@NumComOMaesonRue_SP varchar(50),
@Quartier_SP varchar(50),
@Ville_SP varchar(50),
@Pays_SP varchar(50),
@CodigoPostal_SP varchar(50),
@Fax_SP varchar(50),
@Email_SP varchar(50),
@Telefono_SP varchar(50),
@NoExtencion_SP varchar(50),
@FechaComiensoTrab date,
@TiempoTrabajoActual varchar(50),
@Profesion varchar(50),

/Valores del IDENTIFICACION/
@NIF_Cliente_Iden varchar(50),
@CIN_Cliente_Iden varchar(50),
@NoSegSocial_Iden varchar(50),
@NoPasaporte_Iden varchar(50),
@Email_Iden varchar(50),
@Nacionalidad_Iden varchar(50),
@PaysResidencia_Iden varchar(50),
@SectorProfesional_Iden varchar(50),
@FechaNacimiento_Iden date,
@Sexo_Iden varchar(50),
@LugarNacimiento varchar(50),
@ResidenteONo_Iden varchar(50),
@EstadoCivil_Iden varchar(50),
@PropietarioCasa_Iden varchar(50),
@TypeLogOccupe_Iden varchar(50),
@NoDependientes_Iden varchar(50),
@TelefonoCelular_Iden varchar(50),
@TelefonoPrivado_Iden varchar(50),

/Valores de Padres y Madres/
@NombrePadre varchar(50),
@OtroNombrePadre varchar(50),
@ApellidoPadre varchar(50),
@NombreMadre varchar(50),
@OtroNombreMadre varchar(50),
@ApellidoMadre varchar(50),

/Valores de Tipo de CLiente/

@TipoCliente varchar(25),
@Descripcion_TipoCliente varchar(50),

/Variable para mensage/
@msg AS VARCHAR(100) OUTPUT
AS

BEGIN

SET NOCOUNT ON;

Begin Tran Tadd

Begin Try



INSERT INTO [dbo].[tbl_Cliente] ([Nombre_Cliente], [OtroNombre_Cliente], [Apellidos_Cliente], [NoApartamento_Cliente], [NomComplejo_Cliente], [NumCompleOCasa_Cliente], [Rue_Cliente], [Quartier_Cliente], [Ville_Cliente], [Departament_Cliente], [Pays_Cliente], [CodePostal_Cliente], [ID_TipoCliente_Cliente], [Descripcion_Cliente])
VALUES (@Nombre_Cliente, @OtroNombre_Cliente, @Apellidos_Cliente, @NoApartamento_Cliente, @NomComplejo_Cliente, @NumCompleOCasa_Cliente, @Rue_Cliente, @Quartier_Cliente, @Ville_Cliente, @Departament_Cliente, @Pays_Cliente, @CodePostal_Cliente, @ID_TipoCliente_Cliente, @Descripcion_Cliente);

INSERT INTO [dbo].[tbl_SituacionProfeccionalCliente] ([ID_Cliente], [PosicionOcupa_SP], [Empleador_SP], [NomComplex_SP], [NumComOMaesonRue_SP], [Quartier_SP], [Ville_SP], [Pays_SP], [CodigoPostal_SP], [Fax_SP], [Email_SP], [Telefono_SP], [NoExtencion_SP], [FechaComiensoTrab], [TiempoTrabajoActual], [Profesion])
VALUES (@ID_Cliente, @PosicionOcupa_SP, @Empleador_SP, @NomComplex_SP, @NumComOMaesonRue_SP, @Quartier_SP, @Ville_SP, @Pays_SP, @CodigoPostal_SP, @Fax_SP, @Email_SP, @Telefono_SP, @NoExtencion_SP, @FechaComiensoTrab, @TiempoTrabajoActual, @Profesion);

INSERT INTO [dbo].[tbl_Identificacion] ([ID_Cliente], [NIF_Cliente_Iden], [CIN_Cliente_Iden], [NoSegSocial_Iden], [NoPasaporte_Iden], [Email_Iden], [Nacionalidad_Iden], [PaysResidencia_Iden], [SectorProfesional_Iden], [FechaNacimiento_Iden], [Sexo_Iden], [LugarNacimiento], [ResidenteONo_Iden], [EstadoCivil_Iden], [PropietarioCasa_Iden], [TypeLogOccupe_Iden], [NoDependientes_Iden], [TelefonoCelular_Iden], [TelefonoPrivado_Iden])
VALUES (@ID_Cliente, @NIF_Cliente_Iden, @CIN_Cliente_Iden, @NoSegSocial_Iden, @NoPasaporte_Iden, @Email_Iden, @Nacionalidad_Iden, @PaysResidencia_Iden, @SectorProfesional_Iden, @FechaNacimiento_Iden, @Sexo_Iden, @LugarNacimiento, @ResidenteONo_Iden, @EstadoCivil_Iden, @PropietarioCasa_Iden, @TypeLogOccupe_Iden, @NoDependientes_Iden, @TelefonoCelular_Iden, @TelefonoPrivado_Iden);

INSERT INTO [dbo].[tbl_PadresMadres] ([ID_Cliente], [NombrePadre], [OtroNombrePadre], [ApellidoPadre], [NombreMadre], [OtroNombreMadre], [ApellidoMadre])
VALUES (@ID_Cliente, @NombrePadre, @OtroNombrePadre, @ApellidoPadre, @NombreMadre, @OtroNombreMadre, @ApellidoMadre);

INSERT INTO [dbo].[tbl_TipoCliente] ([TipoCliente], [Descripcion_TipoCliente])
VALUES (@TipoCliente, @Descripcion_TipoCliente);

SET @msg= 'El Cliente se registro correctamente.'

COMMIT TRAN Tadd

End try
Begin Catch

SET @msg= 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.'
Rollback TRAN Tadd

End Catch

END
GO
Clipboard01
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Isaias (4558 intervenciones) el 19/11/2014 17:31:19
Muy pésima decisión tomar un campo IDENTITY para una FOREING KEY, ya no digamos para la PRIMARY KEY.

Te recomiendo que el numero sea generado mediante una función o bien tomar el MAX(ID) + 1

Ahora, resolviendo tu duda, ¿Cómo se cual fue el IDENTITY que me fue otorgado después de una inserccion?


SELECT SCOPE_IDENTITY()

Devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Dariel (25 intervenciones) el 19/11/2014 17:37:37
Gracias, por contestar, voy a probar ahora mismo, pero ya he visto algunos problemas que me crea esto que me dices, como que cuando borro uno de los registros auque sea el ultimo, este no desaparece, se mantiene como si estuviera ejemplo elimino 3 y el proximo que me inserta es el 4 no el 3 auqnue estuviera eliminado, ahora me recomiendas generarlo mediante una funcion, o MAX(ID) + 1, Como seria esto en mi BD, ya que en gran parte de las tablas utilizo Identity. Y gracias por contestar, saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Dariel (25 intervenciones) el 19/11/2014 19:17:55
Hola segui tu consejo he hice los cambios en la Base de Datos, quite el Identity y este es el nuevo procedimiento almacenado, pero cuando lo ejecuto me da error diciendome que no puedo poner NULL a Tipo_Cliente, este esta en una tabla que hasta le quite la relacion y sigue dandome el error, mira mi correo es [email protected], y facebook dariel alvarez perez, por favor si es posible para poder chatear con ud cuando tenga unos min libres podria ayudarme mucho ya que estoy atrasado con esto, y no quiero mandar las cosas desde el VS c# directo asi quisiera poder utilizar los procedimientos almacenados, muchas gracias por todo
saludos dariel alvarez

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
USE [db_Notarie]
GO
/****** Object:  StoredProcedure [dbo].[InsertarCliente]    Script Date: 19/11/2014 1:10:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER PROCEDURE [dbo].[InsertarCliente]
	/*Valores del CLIENTE*/
	@ID_Cliente bigint,
 
	@Nombre_Cliente varchar(50),
	@OtroNombre_Cliente varchar(50),
	@Apellidos_Cliente varchar(50),
	@NoApartamento_Cliente varchar(50),
	@NomComplejo_Cliente varchar(50),
	@NumCompleOCasa_Cliente varchar(50),
	@Rue_Cliente varchar(50),
	@Quartier_Cliente varchar(50),
	@Ville_Cliente varchar(50),
	@Departament_Cliente varchar(50),
	@Pays_Cliente varchar(50),
	@CodePostal_Cliente varchar(50),
	@ID_TipoCliente_Cliente int,
	@Descripcion_Cliente varchar(50),
 
	/*Valores del Situacion Profecional*/
	@PosicionOcupa_SP varchar(50),
	@Empleador_SP varchar(50),
	@NomComplex_SP varchar(50),
	@NumComOMaesonRue_SP varchar(50),
	@Quartier_SP varchar(50),
	@Ville_SP varchar(50),
	@Pays_SP varchar(50),
	@CodigoPostal_SP varchar(50),
	@Fax_SP varchar(50),
	@Email_SP varchar(50),
	@Telefono_SP varchar(50),
	@NoExtencion_SP varchar(50),
	@FechaComiensoTrab date,
	@TiempoTrabajoActual varchar(50),
	@Profesion varchar(50),
 
	/*Valores del IDENTIFICACION*/
	@NIF_Cliente_Iden varchar(50),
	@CIN_Cliente_Iden varchar(50),
	@NoSegSocial_Iden varchar(50),
	@NoPasaporte_Iden varchar(50),
	@Email_Iden varchar(50),
	@Nacionalidad_Iden varchar(50),
	@PaysResidencia_Iden varchar(50),
	@SectorProfesional_Iden varchar(50),
	@FechaNacimiento_Iden date,
	@Sexo_Iden varchar(50),
	@LugarNacimiento varchar(50),
	@ResidenteONo_Iden varchar(50),
	@EstadoCivil_Iden varchar(50),
	@PropietarioCasa_Iden varchar(50),
	@TypeLogOccupe_Iden varchar(50),
	@NoDependientes_Iden varchar(50),
	@TelefonoCelular_Iden varchar(50),
	@TelefonoPrivado_Iden varchar(50),
 
	/*Valores de Padres y Madres*/
	@NombrePadre varchar(50),
	@OtroNombrePadre varchar(50),
	@ApellidoPadre varchar(50),
	@NombreMadre varchar(50),
	@OtroNombreMadre varchar(50),
	@ApellidoMadre varchar(50),
 
	/*Variable para mensage*/
	@msg AS VARCHAR(100) OUTPUT
AS
 
BEGIN
 
    SET NOCOUNT ON;
 
    Begin Tran Tadd
 
    Begin Try
 
				set @ID_Cliente = (SELECT MAX(tbl_Cliente.ID_Cliente)FROM tbl_Cliente);
 
				INSERT INTO [dbo].[tbl_Cliente] ([Nombre_Cliente], [OtroNombre_Cliente], [Apellidos_Cliente], [NoApartamento_Cliente], [NomComplejo_Cliente], [NumCompleOCasa_Cliente], [Rue_Cliente], [Quartier_Cliente], [Ville_Cliente], [Departament_Cliente], [Pays_Cliente], [CodePostal_Cliente], [ID_TipoCliente_Cliente], [Descripcion_Cliente])
				VALUES (@Nombre_Cliente, @OtroNombre_Cliente, @Apellidos_Cliente, @NoApartamento_Cliente, @NomComplejo_Cliente, @NumCompleOCasa_Cliente, @Rue_Cliente, @Quartier_Cliente, @Ville_Cliente, @Departament_Cliente, @Pays_Cliente, @CodePostal_Cliente, @ID_TipoCliente_Cliente, @Descripcion_Cliente);
 
				INSERT INTO [dbo].[tbl_SituacionProfeccionalCliente] ([ID_Cliente], [PosicionOcupa_SP], [Empleador_SP], [NomComplex_SP], [NumComOMaesonRue_SP], [Quartier_SP], [Ville_SP], [Pays_SP], [CodigoPostal_SP], [Fax_SP], [Email_SP], [Telefono_SP], [NoExtencion_SP], [FechaComiensoTrab], [TiempoTrabajoActual], [Profesion])
				VALUES (@ID_Cliente, @PosicionOcupa_SP, @Empleador_SP, @NomComplex_SP, @NumComOMaesonRue_SP, @Quartier_SP, @Ville_SP, @Pays_SP, @CodigoPostal_SP, @Fax_SP, @Email_SP, @Telefono_SP, @NoExtencion_SP, @FechaComiensoTrab, @TiempoTrabajoActual, @Profesion);
 
				INSERT INTO [dbo].[tbl_Identificacion] ([ID_Cliente], [NIF_Cliente_Iden], [CIN_Cliente_Iden], [NoSegSocial_Iden], [NoPasaporte_Iden], [Email_Iden], [Nacionalidad_Iden], [PaysResidencia_Iden], [SectorProfesional_Iden], [FechaNacimiento_Iden], [Sexo_Iden], [LugarNacimiento], [ResidenteONo_Iden], [EstadoCivil_Iden], [PropietarioCasa_Iden], [TypeLogOccupe_Iden], [NoDependientes_Iden], [TelefonoCelular_Iden], [TelefonoPrivado_Iden])
				VALUES (@ID_Cliente, @NIF_Cliente_Iden, @CIN_Cliente_Iden, @NoSegSocial_Iden, @NoPasaporte_Iden, @Email_Iden, @Nacionalidad_Iden, @PaysResidencia_Iden, @SectorProfesional_Iden, @FechaNacimiento_Iden, @Sexo_Iden, @LugarNacimiento, @ResidenteONo_Iden, @EstadoCivil_Iden, @PropietarioCasa_Iden, @TypeLogOccupe_Iden, @NoDependientes_Iden, @TelefonoCelular_Iden, @TelefonoPrivado_Iden);
 
				INSERT INTO [dbo].[tbl_PadresMadres] ([ID_Cliente], [NombrePadre], [OtroNombrePadre], [ApellidoPadre], [NombreMadre], [OtroNombreMadre], [ApellidoMadre])
				VALUES (@ID_Cliente, @NombrePadre, @OtroNombrePadre, @ApellidoPadre, @NombreMadre, @OtroNombreMadre, @ApellidoMadre);
 
				SET @msg = 'El Cliente se registro correctamente.'
 
        COMMIT TRAN Tadd
 
    End try
    Begin Catch
 
        SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.'
        Rollback TRAN Tadd
 
    End Catch
 
END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Isaias (4558 intervenciones) el 19/11/2014 19:42:43
Claro, porque la primera vez, tendría NULL, ahora bien, no se cual sea tu nivel de conocimientos en T-SQL, pero para validar un campo NULL


set @ID_Cliente = (SELECT ISNULL(MAX(tbl_Cliente.ID_Cliente) +1, 1) FROM tbl_Cliente);

Esto significa, si obtienes un NULL, colocale 1 al valor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Dariel (25 intervenciones) el 20/11/2014 14:13:05
Gracias Hermano trabajo perfectamente, ademas de eso lo que tenia el mio que me daba error era que me habia saltado el ; de esa linea de codigo, muchas gracias la verdad, una pregunta, has trabajado el Identity Framework con SQL Server, utilizando estos procedimientos almacenados??
Muchas gracias otra vez, me has salvado
saludos
Dariel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Dariel (25 intervenciones) el 20/11/2014 15:28:00
Disculpa Entity Framework no Identity FrameWork me confundi ajajaja
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias Islas
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Isaias Islas (4558 intervenciones) el 20/11/2014 17:24:05
No soy desarrollador, soy consultor en SQL Server (cualquier versión-edición)

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Dariel (25 intervenciones) el 20/11/2014 17:27:16
Entity Framework Trabaja con el visual studio, te pregunto pk lo estoy utilizando, y tengo algunas dudas, en cuanto a el SQL Server, que me recomiendas, manejar la mayor parte de las operaciones CRUD por Procedimientos Almacenados, o por las funciones que trae el VS. Muchas gracias por tu ayuda de verdad, saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Isaias (4558 intervenciones) el 20/11/2014 18:32:38
Sigue la regla de las TRES CAPAS

- Capa Cliente (.NET, visual studio, entity framework, etc)
- Capa Transaccional (En SQL Server puedes establecer un servidor que haga este paso, si no lo tiene la BD)
- Capa Base de Datos (Donde se aplica todo el entorno de reglas de negocio)

De esta forma, tendrás al final, un buen desarrollo aplicando las mejores practicas.

Recuerda, "Nada de T-SQL debe viajar de la capa CLIENTE a la capa Base de Datos, la capa cliente tiene el 99.99% de la verificación de las reglas"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Patty (1 intervención) el 27/11/2014 18:02:18
Hola, me podria decir donde encuentro mas informacion sobre las regla de tres capas, estoy interesada en la capa Base de Datos.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido su posición en 8 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

Ayuda, Insertar con Procedimiento Almacenado

Publicado por Hugo QN (19 intervenciones) el 19/11/2014 20:12:10
antes de insertar debes consultar a tu tabla

select @id_new = max(id) from tabla

entonces al insertar
inser into tabla (id, nombre, ...)
values (@id_new, 'producto1', ...)

pero el campo de tipo IDENTITY se debe quitar de la llave primaria y crear otro campo para esto llamado id o como quiresa llamarlo.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar