【问题标题】:如何在一个表中多次插入数据(SQL)
【发布时间】:2022-01-23 09:36:02
【问题描述】:

我有3张表如下:

DXBusinessPolicy_Policy

ID Code Name
1 COMBO.2103001 [Giá nền] T9/2020 #1
2 IPTV-0121.002 [Giá nền] T8/2020 #1

DXBusinessPolicy_Service

ID Code Name
1 INT Internet
2 IPTV IPTV
3 CMR Camera
4 FSAFE Fsafe

DXBusinessPolicy_PolicyService

ID PolicyID ServiceID
1 1 1
2 1 2

这是我的存储过程:

CREATE PROCEDURE InsertPolicyService
    @id int,
    @services varchar(1000) //This is Service Name
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'

我想将具有名为 FSAFE 和 CMR 的服务的策略 ID 2 插入到表 DXBusinessPolicy_PolicyService 中。

我尝试执行此存储过程,但出现此错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我的期望是:

DXBusinessPolicy_PolicyService

ID PolicyID ServiceID
1 1 1
2 1 2
3 2 3
4 2 4

【问题讨论】:

  • 我强烈建议您使用表值参数,而不是拆分字符串

标签: sql sql-server tsql stored-procedures sql-insert


【解决方案1】:

您的内部子查询返回多个结果,这是子查询时不可能的。但是,您不需要那么多查询,只需要一个:

INSERT INTO dbo.DXBusinessPolicy_PolicyService (PolicyID, ServiceID) 
    SELECT @id, dbo.DXBusinessPolicy_Service.ID 
    FROM dbo.DXBusinessPolicy_Service
    WHERE dbo.DXBusinessPolicy_Service.Code IN (
        SELECT VALUE FROM string_split(@services,','))
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2022-01-14
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多