none
Inserción de datos UNIQUEIDENTIFIER en una tabla Relacional RRS feed

  • Pregunta

  • Buenas a la comunidad de Ayuda. Quisiera saber cómo Almacenar en una tabla un identificador único de otra tabla que contiene ese Id de tipo UNIQUEIDENTIFIER, qúe tipo de dato lo represento en la tabla relacionada y a la hora de hacer un procedimiento almacenado como hago esa inserción. tengo algo así:

    ALTER PROCEDURE [dbo].[GuardarDatos]
    @Id_Datos UNIQUEIDENTIFIER,    <---------IDENTIFICADOR ÚNICO DE ESTA TABLA "FOREIGNKEY"
    @Id_Tabla1 UNIQUEIDENTIFIER,   <---------LLAVE SECUNDARIA PROVENIENTE DE TABLA 1
    @Id_Tabla2 UNIQUEIDENTIFIER,   <---------LLAVE SECUNDARIA PROVENIENTE DE TABLA 2
    @Id_Tabla3 UNIQUEIDENTIFIER,   <---------LLAVE SECUNDARIA PROVENIENTE DE TABLA 3
    @Nombres varchar(200),              <--------DATOS PROPIOS DE ESTA TABLA
    @Fecha datetime                                                   "
    AS
    INSERT INTO COMITE_TERRITORIAL VALUES(NEWID(), @Id_Tabla1, @Id_Tabla2, @Nombres, @Fecha)
    return


    martes, 9 de julio de 2019 1:32

Respuestas

  • Hola Ramiro Castañeda:

    A priori, lo que tienes es correcto. No se entiende, ¿Cuál es tu duda?

    Del ejemplo supongo que no deberías de pasarle el parámetro id_datos.

    CREATE TABLE dbo.COMITE_TERRITORIAL
    (id_datos  UNIQUEIDENTIFIER, 
     id_tabla1 UNIQUEIDENTIFIER, 
     id_tabla2 UNIQUEIDENTIFIER, 
     id_tabla3 UNIQUEIDENTIFIER, 
     nombres   VARCHAR(200), 
     fecha     DATETIME
    );
    GO
    CREATE TABLE dbo.Tb1
    (ID_Tabla1   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    CREATE TABLE dbo.Tb2
    (ID_Tabla2   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    CREATE TABLE dbo.Tb3
    (ID_Tabla3   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    GO
    
    CREATE PROCEDURE dbo.GUARDARDATOS
    (
     @Id_Tabla1 UNIQUEIDENTIFIER, 
     @Id_Tabla2 UNIQUEIDENTIFIER, 
     @Id_Tabla3 UNIQUEIDENTIFIER, 
     @Nombres   VARCHAR(200), 
     @Fecha     DATETIME
    )
    AS
         INSERT INTO dbo.COMITE_TERRITORIAL
         (id_datos, 
          id_tabla1, 
          id_tabla2, 
          id_tabla3, 
          nombres, 
          fecha
         )
         VALUES
         (NEWID(), 
          @Id_Tabla1, 
          @Id_Tabla2, 
          @Id_Tabla3, 
          @Nombres, 
          @Fecha
         );
         RETURN;
      GO
    DECLARE @IDTB1 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb1
    (ID_Tabla1, 
     descripcion
    )
    VALUES
    (@IDTB1, 
     'ej1'
    );
    DECLARE @IDTB2 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb2
    (ID_Tabla2, 
     descripcion
    )
    VALUES
    (@IDTB2, 
     'ej2'
    );
    DECLARE @IDTB3 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb3
    (ID_Tabla3, 
     descripcion
    )
    VALUES
    (@IDTB3, 
     'ej2'
    );
    DECLARE @des VARCHAR(10)=
    (
        SELECT TOP (1) descripcion
        FROM dbo.tb1
    );
    DECLARE @fecha DATETIME= GETDATE();
    EXEC dbo.GUARDARDATOS 
         @idtb1, 
         @idtb2, 
         @idtb3, 
         @des, 
         @fecha;
    GO
    SELECT COMITE_TERRITORIAL.id_datos, 
           COMITE_TERRITORIAL.id_tabla1, 
           COMITE_TERRITORIAL.id_tabla2, 
           COMITE_TERRITORIAL.id_tabla3, 
           COMITE_TERRITORIAL.nombres, 
           COMITE_TERRITORIAL.fecha
    FROM dbo.COMITE_TERRITORIAL;

    Salida

    • Propuesto como respuesta José Diz miércoles, 10 de julio de 2019 6:21
    • Marcado como respuesta Ramiro Castañeda lunes, 15 de julio de 2019 16:14
    martes, 9 de julio de 2019 3:47
  • Hola.

    Puedes hacer una select contra ese registro porque ya existe para que sea ese valor el que se inserta.

    Insert into....values ((selec id_1 from....), otra col...)

    Tambien puedes insert into ... ( (cast('tu guid con guiones' as uniqueidentifier)), col2....)

    domingo, 14 de julio de 2019 9:34
  • Hola Ramiro Castañeda:

    (Select id_Tabla1 from Tabla1 where …. lo que hace que el registro sea único),.....

    lunes, 15 de julio de 2019 3:16
  • Los uniqueidentifier van entre apóstrofes

    DECLARE @RETURN_VALUE INT; DECLARE

    @IDAF UNIQUEIDENTIFIER = CAST(N'a82c5590-f9fb-4ba4-83c6-9c0c0722b65e' AS UNIQUEIDENTIFIER), @IDUS UNIQUEIDENTIFIER = CAST(N'd118df00-08f4-4ced-9f34-93b654a77971' AS UNIQUEIDENTIFIER), @IDJRV UNIQUEIDENTIFIER= CAST(N'a82c5590-f9fb-4ba4-83c6-9c9c9722c84e' AS UNIQUEIDENTIFIER); EXEC @RETURN_VALUE = dbo.GUARDARDATOS @id_afiliado = @IDAF, @id_Usuario = @IDUS, @id_jrv = @IDJRV, @Nombre_cargo = N'Admin', @Fecha = '20190724' Select 'return value'=@RETURN_VALUE go

    Salida

    Si no quieres tener nunca problemas con las fechas, ingresa siempre las mismas como yyyyMMdd

    jueves, 25 de julio de 2019 3:34
  • Está excelente tu respuesta, pero la pregunta en si es la siguiente:

    Si en una tabla ya existe un dato de tipo uniqueidentifier id_1= a82c5590-f9fb-4ba4-83c6-9c0c0722b65e; pero hay otra tabla donde tengo que agregarle ese dato "id_1", porque es una tabla que debe de contener ese mismo dato pero al hacer la insersión no permite por los guines; que puedo hacer?


    domingo, 14 de julio de 2019 1:10
  • Lo he hecho de esa manera, pero no comprendo como hacer un select, si lo que quiero es insertar esos datos que ya los he obtenido de otras consultas o procedimientos almacenados. Me manda el siguiente error al ejecutar el store procedure:

    Mens 512, Nivel 16, Estado 1, Procedimiento GuardarDatos, Línea 14
    La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
    Se terminó la instrucción.

    (1 filas afectadas)

    El procedimiento almacenado que he creado es:

     

    ALTER PROCEDURE [dbo].[Guardar_Datos]
    @Id_Tabla1 UNIQUEIDENTIFIER,
    @Id_Tabla2 UNIQUEIDENTIFIER,
    @Fecha datetime,
    @Nombres varchar(100),
    @Apellidos varchar(100),

    AS

    INSERT INTO Guardar_Datos
    VALUES(NEWID(), (select Id_Tabla1 from Tabla1), (select Id_Tabla2 from Tabla2), @Fecha,                 @Nombres,@Apellidos, )
    RETURN 0

    Como inserto los datos ya obtenidos en esa tabla?

    lunes, 15 de julio de 2019 2:41
  • Hola Javi Fernández, sigo sin entender, podrías ser mas explícito porfavor?

    (Select id_Tabla1 from Tabla1 where …. lo que hace que el registro sea único?????????),.....

    lunes, 15 de julio de 2019 3:32

Todas las respuestas

  • Hola Ramiro Castañeda:

    A priori, lo que tienes es correcto. No se entiende, ¿Cuál es tu duda?

    Del ejemplo supongo que no deberías de pasarle el parámetro id_datos.

    CREATE TABLE dbo.COMITE_TERRITORIAL
    (id_datos  UNIQUEIDENTIFIER, 
     id_tabla1 UNIQUEIDENTIFIER, 
     id_tabla2 UNIQUEIDENTIFIER, 
     id_tabla3 UNIQUEIDENTIFIER, 
     nombres   VARCHAR(200), 
     fecha     DATETIME
    );
    GO
    CREATE TABLE dbo.Tb1
    (ID_Tabla1   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    CREATE TABLE dbo.Tb2
    (ID_Tabla2   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    CREATE TABLE dbo.Tb3
    (ID_Tabla3   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    GO
    
    CREATE PROCEDURE dbo.GUARDARDATOS
    (
     @Id_Tabla1 UNIQUEIDENTIFIER, 
     @Id_Tabla2 UNIQUEIDENTIFIER, 
     @Id_Tabla3 UNIQUEIDENTIFIER, 
     @Nombres   VARCHAR(200), 
     @Fecha     DATETIME
    )
    AS
         INSERT INTO dbo.COMITE_TERRITORIAL
         (id_datos, 
          id_tabla1, 
          id_tabla2, 
          id_tabla3, 
          nombres, 
          fecha
         )
         VALUES
         (NEWID(), 
          @Id_Tabla1, 
          @Id_Tabla2, 
          @Id_Tabla3, 
          @Nombres, 
          @Fecha
         );
         RETURN;
      GO
    DECLARE @IDTB1 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb1
    (ID_Tabla1, 
     descripcion
    )
    VALUES
    (@IDTB1, 
     'ej1'
    );
    DECLARE @IDTB2 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb2
    (ID_Tabla2, 
     descripcion
    )
    VALUES
    (@IDTB2, 
     'ej2'
    );
    DECLARE @IDTB3 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb3
    (ID_Tabla3, 
     descripcion
    )
    VALUES
    (@IDTB3, 
     'ej2'
    );
    DECLARE @des VARCHAR(10)=
    (
        SELECT TOP (1) descripcion
        FROM dbo.tb1
    );
    DECLARE @fecha DATETIME= GETDATE();
    EXEC dbo.GUARDARDATOS 
         @idtb1, 
         @idtb2, 
         @idtb3, 
         @des, 
         @fecha;
    GO
    SELECT COMITE_TERRITORIAL.id_datos, 
           COMITE_TERRITORIAL.id_tabla1, 
           COMITE_TERRITORIAL.id_tabla2, 
           COMITE_TERRITORIAL.id_tabla3, 
           COMITE_TERRITORIAL.nombres, 
           COMITE_TERRITORIAL.fecha
    FROM dbo.COMITE_TERRITORIAL;

    Salida

    • Propuesto como respuesta José Diz miércoles, 10 de julio de 2019 6:21
    • Marcado como respuesta Ramiro Castañeda lunes, 15 de julio de 2019 16:14
    martes, 9 de julio de 2019 3:47
  • Está excelente tu respuesta, pero la pregunta en si es la siguiente:

    Si en una tabla ya existe un dato de tipo uniqueidentifier id_1= a82c5590-f9fb-4ba4-83c6-9c0c0722b65e; pero hay otra tabla donde tengo que agregarle ese dato "id_1", porque es una tabla que debe de contener ese mismo dato pero al hacer la insersión no permite por los guines; que puedo hacer?


    domingo, 14 de julio de 2019 1:10
  • Hola.

    Puedes hacer una select contra ese registro porque ya existe para que sea ese valor el que se inserta.

    Insert into....values ((selec id_1 from....), otra col...)

    Tambien puedes insert into ... ( (cast('tu guid con guiones' as uniqueidentifier)), col2....)

    domingo, 14 de julio de 2019 9:34
  • Lo he hecho de esa manera, pero no comprendo como hacer un select, si lo que quiero es insertar esos datos que ya los he obtenido de otras consultas o procedimientos almacenados. Me manda el siguiente error al ejecutar el store procedure:

    Mens 512, Nivel 16, Estado 1, Procedimiento GuardarDatos, Línea 14
    La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
    Se terminó la instrucción.

    (1 filas afectadas)

    El procedimiento almacenado que he creado es:

     

    ALTER PROCEDURE [dbo].[Guardar_Datos]
    @Id_Tabla1 UNIQUEIDENTIFIER,
    @Id_Tabla2 UNIQUEIDENTIFIER,
    @Fecha datetime,
    @Nombres varchar(100),
    @Apellidos varchar(100),

    AS

    INSERT INTO Guardar_Datos
    VALUES(NEWID(), (select Id_Tabla1 from Tabla1), (select Id_Tabla2 from Tabla2), @Fecha,                 @Nombres,@Apellidos, )
    RETURN 0

    Como inserto los datos ya obtenidos en esa tabla?

    lunes, 15 de julio de 2019 2:41
  • Hola Ramiro Castañeda:

    (Select id_Tabla1 from Tabla1 where …. lo que hace que el registro sea único),.....

    lunes, 15 de julio de 2019 3:16
  • Hola Javi Fernández, sigo sin entender, podrías ser mas explícito porfavor?

    (Select id_Tabla1 from Tabla1 where …. lo que hace que el registro sea único?????????),.....

    lunes, 15 de julio de 2019 3:32
  • Hola Ramiro Castañeda:

    Tu estas insertando una fila, pero en la parte de values dices 

    Newid() … 1 solo valor

    (Select id_tabla1 from tabla1) …. tantas filas como tenga tabla1....aquí el error.

    (Select id_Tabla2 from tabla2)….. tantas filas como tenga tabla2 … aquí el error.

    @fecha....1 solo valor

    @nombre …. 1 solo valor

    @apellidos …. 1 solo valor

    Los select tienen que devolver, si o si, 1 fila, en este caso para la columna id_tabla1 y el otro id_tabla2.

    Te pongo un ejemplo completo.

    CREATE TABLE tabla1
    (id_tabla1 UNIQUEIDENTIFIER, 
     otro      INT
    );
    CREATE TABLE tabla2
    (id_tabla2 UNIQUEIDENTIFIER, 
     otro      INT
    );
    GO
    INSERT INTO tabla1
    (id_tabla1, 
     otro
    )
    VALUES
    (NEWID(),  1),
    (NEWID(),  2),
    (NEWID(),  3),
    (NEWID(),  4);
    GO
    INSERT INTO tabla2
    (id_tabla2, 
     otro
    )
    VALUES
    (NEWID(),  1),
    (NEWID(),  2),
    (NEWID(),  3),
    (NEWID(),  4);
    GO
    
    CREATE TABLE Guardar_datos
    (id        UNIQUEIDENTIFIER, 
     idTabla1  UNIQUEIDENTIFIER, 
     idTabla2  UNIQUEIDENTIFIER, 
     fecha     DATETIME, 
     nombres   VARCHAR(100), 
     apellidos VARCHAR(100)
    );
    GO

    Con estas tablas de ejemplo y la tabla destino creada.

    Retoco tu procedimiento porque tiene más cosas erróneas.

    CREATE PROCEDURE [dbo].[sp_Guardar_Datos]
    (
     @Fecha     DATETIME, 
     @Nombres   VARCHAR(100), 
     @Apellidos VARCHAR(100)
    )
    AS
         INSERT INTO Guardar_Datos
         VALUES
         (NEWID(), 
         (
             SELECT Id_Tabla1
             FROM Tabla1
             WHERE otro = 1
         ), 
         (
             SELECT TOP (1) Id_Tabla2
             FROM Tabla2
             ORDER BY otro DESC
         ), 
          @Fecha, 
          @Nombres, 
          @Apellidos
         );
         RETURN 0;
    GO
    

    Si los valores @id_tabla1 y @id_Tabla2 son obtenidos de la base de datos, no se le pasan como parámetros.

    Si por el contrario ya dispusieras de ellos en el entorno que llama al procedure, entonces, quitas las select, y pones los valores con variables, como has realizado en @nombres, @fecha y @apellidos.

    declare @fecha datetime =getdate();
    exec sp_Guardar_Datos @fecha, 'juan', 'vazquez'

    Una vez ejecutado el procedure.

    Select * from Guardar_Datos

    lunes, 15 de julio de 2019 4:40
  • Quiero pasarle los datos de la tabla 1 a otra que se llama principal, donde en ésta contengo las llaves foráneas de las otras 2

    ALTER PROCEDURE [dbo].[Guardar_Datos]
    @Id_Tabla1 UNIQUEIDENTIFIER,
    @Id_Tabla2 UNIQUEIDENTIFIER,
    @Fecha datetime,
    @Nombres varchar(100),
    @Apellidos varchar(100),
    @Cedula varchar(100),
    @Direccion varchar(200),
    @Mun_Com_Bar varchar(200),
    @Telefono int,
    @Correo varchar(100)
    AS

    INSERT INTO Tabla_Ppal
    VALUES(NEWID(), (select Id_Tabla1 from Tabla1 where Id_Tabla1=@Id_Tabla1), (select Id_Tabla2 from Tabla2 where Id_Tabla2=@Id_Tabla2),  
    @Fecha, @Nombres,
      @Apellidos, @Cedula, @Direccion, @Mun_Com_Bar, @Telefono, @Correo) 
    RETURN 0

    pero no puedo hacer inserción de los datos ya contenidos de las tablas anteriores que ya contienen datos uniqueidentifier con esos mismos valores a la tabla principal.... 

    lunes, 15 de julio de 2019 4:57
  • Quiero pasarle los datos de la tabla 1 a otra que se llama principal, donde en ésta contengo las llaves foráneas de las otras 2

    ALTER PROCEDURE [dbo].[Guardar_Datos]
    @Id_Tabla1 UNIQUEIDENTIFIER,
    @Id_Tabla2 UNIQUEIDENTIFIER,
    @Fecha datetime,
    @Nombres varchar(100),
    @Apellidos varchar(100),
    @Cedula varchar(100),
    @Direccion varchar(200),
    @Mun_Com_Bar varchar(200),
    @Telefono int,
    @Correo varchar(100)
    AS

    INSERT INTO Tabla_Ppal
    VALUES(NEWID(), (select Id_Tabla1 from Tabla1 where Id_Tabla1=@Id_Tabla1), (select Id_Tabla2 from Tabla2 where Id_Tabla2=@Id_Tabla2),  
    @Fecha, @Nombres,
      @Apellidos, @Cedula, @Direccion, @Mun_Com_Bar, @Telefono, @Correo) 
    RETURN 0

    pero no puedo hacer inserción de los datos ya contenidos de las tablas anteriores que ya contienen datos uniqueidentifier con esos mismos valores a la tabla principal.... 

    Es que necesito pasarle los parámetros de las tablas anteriores para ingresar los mismos correspondientes a esa tabla, ya que esos datos me tienen que interesar
    lunes, 15 de julio de 2019 5:07
  • Hola, estoy de acuerdo con lo que dices de no pasar el dato id_datos, porque por default él lo hace con NewID(), pero si necesito obtener los otros 

    id_tabla1 UNIQUEIDENTIFIER, id_tabla2 UNIQUEIDENTIFIER, id_tabla3 UNIQUEIDENTIFIER,

    que pertenecen a las tablas1, 2 y 3 para ingresarlos en la tabla correspondiente llamada como

    tabla Principal que contiene con esos datos. Cómo puedo hacer sabiendo que los datos son únicos

    y los necesito dentro de esa tabla principal porque los debería de contener?

    lunes, 15 de julio de 2019 16:34
  • Hola Ramiro Castañeda:

    A priori, lo que tienes es correcto. No se entiende, ¿Cuál es tu duda?

    Del ejemplo supongo que no deberías de pasarle el parámetro id_datos.

    CREATE TABLE dbo.COMITE_TERRITORIAL
    (id_datos  UNIQUEIDENTIFIER, 
     id_tabla1 UNIQUEIDENTIFIER, 
     id_tabla2 UNIQUEIDENTIFIER, 
     id_tabla3 UNIQUEIDENTIFIER, 
     nombres   VARCHAR(200), 
     fecha     DATETIME
    );
    GO
    CREATE TABLE dbo.Tb1
    (ID_Tabla1   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    CREATE TABLE dbo.Tb2
    (ID_Tabla2   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    CREATE TABLE dbo.Tb3
    (ID_Tabla3   UNIQUEIDENTIFIER, 
     descripcion VARCHAR(10)
    );
    GO
    
    CREATE PROCEDURE dbo.GUARDARDATOS
    (
     @Id_Tabla1 UNIQUEIDENTIFIER, 
     @Id_Tabla2 UNIQUEIDENTIFIER, 
     @Id_Tabla3 UNIQUEIDENTIFIER, 
     @Nombres   VARCHAR(200), 
     @Fecha     DATETIME
    )
    AS
         INSERT INTO dbo.COMITE_TERRITORIAL
         (id_datos, 
          id_tabla1, 
          id_tabla2, 
          id_tabla3, 
          nombres, 
          fecha
         )
         VALUES
         (NEWID(), 
          @Id_Tabla1, 
          @Id_Tabla2, 
          @Id_Tabla3, 
          @Nombres, 
          @Fecha
         );
         RETURN;
      GO
    DECLARE @IDTB1 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb1
    (ID_Tabla1, 
     descripcion
    )
    VALUES
    (@IDTB1, 
     'ej1'
    );
    DECLARE @IDTB2 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb2
    (ID_Tabla2, 
     descripcion
    )
    VALUES
    (@IDTB2, 
     'ej2'
    );
    DECLARE @IDTB3 UNIQUEIDENTIFIER= NEWID();
    INSERT INTO DBO.Tb3
    (ID_Tabla3, 
     descripcion
    )
    VALUES
    (@IDTB3, 
     'ej2'
    );
    DECLARE @des VARCHAR(10)=
    (
        SELECT TOP (1) descripcion
        FROM dbo.tb1
    );
    DECLARE @fecha DATETIME= GETDATE();
    EXEC dbo.GUARDARDATOS 
         @idtb1, 
         @idtb2, 
         @idtb3, 
         @des, 
         @fecha;
    GO
    SELECT COMITE_TERRITORIAL.id_datos, 
           COMITE_TERRITORIAL.id_tabla1, 
           COMITE_TERRITORIAL.id_tabla2, 
           COMITE_TERRITORIAL.id_tabla3, 
           COMITE_TERRITORIAL.nombres, 
           COMITE_TERRITORIAL.fecha
    FROM dbo.COMITE_TERRITORIAL;

    Salida

    EN SI, POR QUÉ NECESITO ESOS DATOS? EN MI FORMULARIO DESDE UN COMBOBOX LLAMO UN DATO Y OBTENGO EL ID ÚNICO PARA INGRESARLO CON UN STORED PROCEDURE EN DICHA TABLA
    lunes, 15 de julio de 2019 17:13
  • Hola Ramiro Castañeda:

    Pero esos 3 valores de las tablas que tu dices que pertenecen a las tablas 1, 2 y 3, desde tu software cliente los tienes?.

    ¿Corresponden a los valores de algún tipo de selector?

    Entonces la pregunta es, ¿desde el software cliente, puedes indentificar unívocamente a esos ids?. Si la respuesta es si, esos uniqueidentifier o Guid que tienes en capa cliente, son los que pasas como parámetros y los que insertas.

    Si la respuesta es no, pero, con lo que tienes en el software cliente, si puedes decirle al SQL cual es ese registro, también es válido, entonces, tienes que hacer un select, pero tiene que identificar explícitamente a esa id de esa fila, y no a varios

    lunes, 15 de julio de 2019 20:24
  • Hola, de hecho esos 3 valores pertenecientes a las tablas 1, 2 y 3 si pertenecen a otras tablas y si los debo de ingresar a mi tabla principal para hacer énfasis a esos id's para obtener detalles de ese registro por medio de ese id único y luego almacenarlo en mi tabla principal, ya que dentro de ésta necesito ese dato importante. Entonces, cómo hago ese procedimiento almacenado donde yo pueda ingresar los id's de las tablas anteriores (Como llave foránea dentro de esta) a ésta tabla principal?

    El asunto es que ahora estoy usando uniqueidentifier como tipo de dato ya antes yo usaba de tipo int autoincrementable y no tenía muchas dificultades.

    Gracias de antemano. Saludos

    miércoles, 17 de julio de 2019 4:02
  • Hola Ramiro Castañeda:

    El asunto es que ahora estoy usando uniqueidentifier como tipo de dato ya antes yo usaba de tipo int autoincrementable y no tenía muchas dificultades.

    En SQL Server no existen los int autoincrementables como en Oracle o MySql, aquí más bien son identidad o secuencias.

    Y los problemas, y su solución son exactamente los mismos, que fueran int, o cualquier otro tipo.

    Olvida el tipo de dato, que son y céntrate en el problema.

    Para poder insertar en la tabla principal este registro nuevo, necesitas saber cuales son los otros tres registros.

    Si esos tres registros ya existen, y su elección depende de una interacción del usuario, por una elección en desplegables o cualquier otra causística, se los tienes que pasar como parámetros al procedure y entonces en la sentencia de inserción,

    Insert into tabla

    values

    (newid(), @idTabla1, @idTabla2, @idTabla3....

    ¿Es este tu caso?

    miércoles, 17 de julio de 2019 4:27
  • Éste es mi caso, pero cunado le paso los parámetros me da error en los guiones de los GUID's. 

    Mens. 102, Nivel 15, Estado 1, Línea 5
    Sintaxis incorrecta cerca de '-'.                    --->ésto cuando agrego mis guids manualmente extraidos de las tablas anteriores.

    sábado, 20 de julio de 2019 3:56
  • Hola Ramiro Castañeda:

    Pega el código completo de tu procedure, y también el método del software cliente, con el que llamas al procedure.

    sábado, 20 de julio de 2019 5:39
  • ALTER PROCEDURE [dbo].[Guardar_Datos]
    @Id_usuario UNIQUEIDENTIFIER,
    @Id_JRV UNIQUEIDENTIFIER,
    @Fecha datetime,
    @Nombres varchar(100),
    @Apellidos varchar(100),
    @Cedula varchar(100),
    @Direccion varchar(200),
    @Mun_Com_Bar varchar(200),
    @Telefono int,
    @Correo varchar(100)
    AS
    INSERT INTO Tabla_Ppal
    VALUES(NEWID(), @Id_usuario, @Id_JRV, @Fecha, @Nombres, @Apellidos, @Cedula, @Direccion, @Mun_Com_Bar, @Telefono, @Correo)

    RETURN 

    ENTONCES PARA A LA HORA DE SELECCIÓN EN UN COMBOBOX TENGO QUE MOSTRAR EL NOMBRE DE USUARIO Y TOMAR SU ID (GUID) Y LO MISMO PARA JRV, QUE ME MUESTRE SU NOMBRE Y TOMAR SU ID TAMBIÉN. DE ESO YO ME ENCARGO... ESTOY TRABAJANDO BAJO LA PROGRAMACIÓN EN 3 CAPAS.

    SALUDOS HERMANO.

      
    lunes, 22 de julio de 2019 0:17
  • Hola Ramiro:

    Pega el código del método que hace el intento de inserción.

    lunes, 22 de julio de 2019 4:39
  • Es que el método que uso es en 3 capas, uno de negociación, otra de datos y la última de presentación; donde en la de presentación es donde llamo a la de negociación para hacer mi respectiva inserción, todas vinculadas entre sí.

    En el combobox primero llamo al dato tomando como referencia su id y mostrar otro dato dentro de él, trabjando con dataset programable.

    Lo que me interesa es el procedimiento almacenado de inserción dentro de la tabla principal, teniendo en cuenta que dentro de ésta tenemos dos id's propios de otras 2 tablas que las necesito en mi tabla principal, o sea son llaves foráneas. Me prodrías ayudar en esa consulta?

    Te mostraré el diseño de la base de datos como diagrama de ejemplo qué es lo que quiero realmente:

    los id de usuario, afiliado y jrv son uniqueidentifier

    Cómo hago mi procedimiento almacenado para hacer un insert en mi tabla COMITE_TERRITORIAL, teniendo en cuenta que ya tengo datos en las tablas Usuario, Afiliado y JRV?

    miércoles, 24 de julio de 2019 1:38
  • Hola Ramiro Castañeda:

    CREATE TABLE comite_Territorial
    (Id_Comite    UNIQUEIDENTIFIER, 
     Id_Afiliado  UNIQUEIDENTIFIER, 
     Id_Usuario   UNIQUEIDENTIFIER, 
     Id_JRV       UNIQUEIDENTIFIER, 
     Nombre_Cargo VARCHAR(200), 
     Fecha        DATETIME
    );
    GO
    CREATE OR ALTER PROCEDURE dbo.GUARDARDATOS
    (@Id_Afiliado  UNIQUEIDENTIFIER, 
     @Id_Usuario   UNIQUEIDENTIFIER, 
     @Id_JRV       UNIQUEIDENTIFIER, 
     @Nombre_Cargo VARCHAR(200), 
     @Fecha        DATETIME
    )
    AS
         INSERT INTO dbo.COMITE_TERRITORIAL
         (id_Comite, 
          id_Afiliado, 
          id_Usuario, 
          id_JRV, 
          nombre_Cargo, 
          fecha
         )
         VALUES
         (NEWID(), 
          @Id_Afiliado, 
          @Id_Usuario, 
          @Id_JRV, 
          @Nombre_Cargo, 
          @Fecha
         );
         RETURN;

    La parte del create table tú ya la tienes.

    C# donde probablemente esta tu error.

    {
    var ConnectionString = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=foros;Server=ESQUINERO";
    /* como yo no tengo los valores, creo variables locales para emular lo que tu ya tienes*/
    DateTime date = DateTime.Now;
    Guid idafil = Guid.NewGuid();
    Guid idusur = Guid.NewGuid();
    Guid idjrv = Guid.NewGuid();
    string nomCargo = "nombre";
    
    
    using (SqlConnection con = new SqlConnection(ConnectionString))
    {
        con.Open();
    
        textBoxFecha.Text = date.ToString();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "dbo.GuardarDatos";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@Id_Afiliado", SqlDbType.UniqueIdentifier);
        cmd.Parameters.Add("@Id_Usuario", SqlDbType.UniqueIdentifier);
        cmd.Parameters.Add("@Id_JRV", SqlDbType.UniqueIdentifier);
        cmd.Parameters.Add("@Nombre_Cargo", SqlDbType.VarChar, 200);
        cmd.Parameters.Add("@Fecha", SqlDbType.DateTime);
        cmd.Parameters[0].Value = idafil;
        cmd.Parameters[1].Value = idusur;
        cmd.Parameters[2].Value = idjrv;
        cmd.Parameters[3].Value = nomCargo;
        cmd.Parameters[4].Value = date;
        
    
        cmd.ExecuteNonQuery();
    
    }
    }
    

    Salida


    miércoles, 24 de julio de 2019 3:52
  • Fijate que hice el procedimiento almacenado tal y como lo has hecho tú, pero me da error al querer ingresar un dato de tipo UNIQUEIDENTIFIER que ya estaban registrados en las otras tablas. 

    Con respecto al método utilizado no tengo problemas, porque quiero primero asegurarme de hace un ingreso desde sql server y no lo he podido conseguir. A caso a la hora de ingresar los datos uniqueidentifier dentro de mi tabla principal no los tengo que hacer repetidos de mis tablas secundarias? Entonces, no tendría lógica de conseguir lo que quiero. Cómo hago esa consulta de inserción?

    miércoles, 24 de julio de 2019 20:28
  • Los uniqueidentifier van entre apóstrofes

    DECLARE @RETURN_VALUE INT; DECLARE

    @IDAF UNIQUEIDENTIFIER = CAST(N'a82c5590-f9fb-4ba4-83c6-9c0c0722b65e' AS UNIQUEIDENTIFIER), @IDUS UNIQUEIDENTIFIER = CAST(N'd118df00-08f4-4ced-9f34-93b654a77971' AS UNIQUEIDENTIFIER), @IDJRV UNIQUEIDENTIFIER= CAST(N'a82c5590-f9fb-4ba4-83c6-9c9c9722c84e' AS UNIQUEIDENTIFIER); EXEC @RETURN_VALUE = dbo.GUARDARDATOS @id_afiliado = @IDAF, @id_Usuario = @IDUS, @id_jrv = @IDJRV, @Nombre_cargo = N'Admin', @Fecha = '20190724' Select 'return value'=@RETURN_VALUE go

    Salida

    Si no quieres tener nunca problemas con las fechas, ingresa siempre las mismas como yyyyMMdd

    jueves, 25 de julio de 2019 3:34
  • Está escelente me ha funcionado; simplemente eran esas comillas simales y listo...

    Ahora tengo este problemita, no se por qué en este sistema no me está funcionando y es la comunicación entre forms. Me está generando este error.

    este es el método para hacer referencia al form principal. E aquí mi error:

    y este es el procedimiento almacenado:

    ALTER PROCEDURE [dbo].[LoginUsuario]
    @Nombre varchar(100),
    @Contrasena varchar(100)
    AS
    SELECT        
    (Nombres+' '+ Apellidos), Rol
    FROM
                USUARIO

    WHERE (@Nombre=Nombre_Usuario) and (@Contrasena=Contrasena)
    RETURN

    jueves, 25 de julio de 2019 18:24
  • Hola Ramiro Castañeda:

    Ese error es del foro de c# no del SQL.

    Además de ser otra pregunta completamente diferente.

    No obstante el error dice que estas referenciando a un objeto que no existe.

    Por ejemplo ese casteo a label de controls["lbusuario"]

    Utiliza las herramientas de depuración de visual studio, para saber si el objeto esta inicializado.

    Olvídate del procedure, que en ese código no esta mencionado, y donde rompe no se utiliza.

    Depurar en vs

    https://docs.microsoft.com/es-es/visualstudio/get-started/csharp/tutorial-debugger?view=vs-2019

    Foro c#

    https://social.msdn.microsoft.com/Forums/es-ES/home?forum=vcses&filter=alltypes&sort=lastpostdesc

    jueves, 25 de julio de 2019 18:36
  • Pues te cuento que ya he agregado un label con ese nombre "lbusuario" en mi formulario principal. Por eso es mi incógnita.
    jueves, 25 de julio de 2019 18:45
  • ya tengo la solución: Simplemente era que tenía el label dentro de un panel en el formulario tipo ribbon de devexpress mejor excluirlo de ese panel y listo... Gracias a todos por su ayuda

    domingo, 28 de julio de 2019 19:22