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 |
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:
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.