es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo insertar datos varias veces en una tabla (SQL)

Tengo 3 tablas de la siguiente manera:

DXBusinessPolicy_Policy

ID Código Nombre
1 COMBO.2103001 [Giá nền] T9/2020 #1
2 IPTV-0121.002 [Giá nền] T8/2020 #1

DXBusinessPolicy_Service

ID Código Nombre
1 INT Internet
2 IPTV IPTV
3 CMR Cámara
4 FSAFE Fsafe

DXBusinessPolicy_PolicyService

ID PolicyID ServiceID
1 1 1
2 1 2

Aquí está mi procedimiento almacenado:

CREATE PROCEDURE InsertPolicyService
    @id int,
    @services varchar(1000) //Este es el nombre del servicio
AS 
BEGIN 
    INSERT INTO dbo.DXBusinessPolicy_PolicyService (PolicyID, ServiceID) 
        SELECT 
            @id,
            (SELECT dbo.DXBusinessPolicy_Service.ID 
             FROM dbo.DXBusinessPolicy_Service
             WHERE dbo.DXBusinessPolicy_Service.Code IN (SELECT VALUE FROM string_split(@services, ',')))
END 

EXEC InsertPolicyService 2, 'FSAFE,CMR'

Deseo insertar el ID de política 2 con los servicios llamados FSAFE y CMR en la tabla DXBusinessPolicy_PolicyService.

Intenté ejecutar este procedimiento almacenado, pero obtengo el siguiente error:

Subconsulta devolvió más de 1 valor. Esto no está permitido cuando la subconsulta sigue a =, !=, <, <=, >, >= o cuando la subconsulta se utiliza como expresión.

Mi expectativa es:

DXBusinessPolicy_PolicyService

ID PolicyID ServiceID
1 1 1
2 1 2
3 2 3
4 2 4
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la subconsulta utilizada para seleccionar ServiceID devuelve más de un valor, lo cual no está permitido en este contexto. Una posible solución es utilizar el operador IN en lugar de =, como se muestra en el procedimiento almacenado. Sin embargo, dado que la subconsulta sigue devolviendo más de un valor, debemos modificar la consulta para manejar múltiples valores.

    Una forma de hacer esto es utilizar JOIN entre la tabla DXBusinessPolicy_Service y una tabla temporal que contenga la lista de nombres de servicio. Aquí está el procedimiento almacenado actualizado:

    CREATE PROCEDURE InsertPolicyService
        @id int,
        @services varchar(1000) --Este es el nombre del servicio
    AS 
    BEGIN 
        -- Crear tabla temporal para almacenar la lista de nombres de servicio
        CREATE TABLE #services (Name varchar(100))
    
        -- Dividir la cadena de entrada e insertar en la tabla temporal
        INSERT INTO #services (Name)
            SELECT value FROM string_split(@services, ',')
    
        -- Insertar pares correspondientes de PolicyID y ServiceID en DXBusinessPolicy_PolicyService
        INSERT INTO dbo.DXBusinessPolicy_PolicyService (PolicyID, ServiceID) 
            SELECT @id, s.ID
                FROM #services t
                JOIN dbo.DXBusinessPolicy_Service s ON s.Name = t.Name
    
        -- Eliminar la tabla temporal
        DROP TABLE #services
    END
    

    Este procedimiento almacenado primero crea una tabla temporal para almacenar la lista de nombres de servicio, divide la cadena de entrada e inserta los valores en la tabla temporal, luego une la tabla temporal con la tabla DXBusinessPolicy_Service para encontrar los valores de ServiceID coincidentes y finalmente inserta los pares de PolicyID y ServiceID en la tabla DXBusinessPolicy_PolicyService.

    Nota: Esta solución asume que los nombres de servicio son únicos en la tabla DXBusinessPolicy_Service. Si hay duplicados, es posible que necesite modificar la consulta para manejar este caso.

Comments are closed.