Sql server T-SQL检查列表是否有值,选择并插入到表中

Sql server T-SQL检查列表是否有值,选择并插入到表中,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我是T-SQL的新手,目前正在存储过程中处理insert语句:我在存储过程中使用INT类型的ID列表作为参数 如果列表不是空的,我想将id存储到表Delivery中 要传递ID列表,我使用表类型: CREATE TYPE tIdList AS TABLE ( ID INT NULL ); GO 也许您知道将ID列表传递到存储过程的更好方法 但是,我的程序如下所示: -- parameter @DeliveryModelIds tIdList READONLY ... DECLARE

我是T-SQL的新手,目前正在存储过程中处理insert语句:我在存储过程中使用INT类型的ID列表作为参数

如果列表不是空的,我想将id存储到表Delivery中

要传递ID列表,我使用表类型:

CREATE TYPE tIdList AS TABLE 
(
    ID INT NULL
);
GO
也许您知道将ID列表传递到存储过程的更好方法

但是,我的程序如下所示:

-- parameter
@DeliveryModelIds tIdList READONLY

...
DECLARE @StoreId INT = 1;

-- Delivery
IF EXISTS (SELECT * FROM @DeliveryModelIds)
    INSERT [MyDB].[Delivery] ([DeliveryModelId], [StoreId])
    OUTPUT inserted.DeliveryId
        SELECT ID FROM @DeliveryModelIds;
如果列表中有值,我希望将这些值存储到DB中,并将StoreId(始终为1)存储到DB中

如果插入DeliveryIds 3,7,5,表Delivery中的结果应如下所示:

DeliveryId | StoreId | DeliveryModelId
1………| 1………| 3
2………| 1………| 7
3………..1………..5

你对如何解决这个问题有什么想法吗


谢谢

您需要将
INSERT
语句修改为:

INSERT [MyDB].[Delivery] ([DeliveryModelId], [StoreId])
    OUTPUT inserted.DeliveryId
        SELECT ID, 1 FROM @DeliveryModelIds;

因此,您还选择了一个文本,
1
,以及
ID
字段。

您可以将
@StoreId
添加到
中,为
插入选择

...
IF EXISTS (SELECT * FROM @DeliveryModelIds)
    INSERT [MyDB].[Delivery] ([DeliveryModelId], [StoreId])
    OUTPUT inserted.DeliveryId
        SELECT ID, @StoreId FROM @DeliveryModelIds;
此外,如果只想插入目标表中当前不存在的
DeliveryModelId
,可以在
where
子句中使用
notexists()
,如下所示:

...
IF EXISTS (SELECT * FROM @DeliveryModelIds)
    INSERT [MyDB].[Delivery] ([DeliveryModelId], [StoreId])
    OUTPUT inserted.DeliveryId
        SELECT dmi.ID, @StoreId 
        FROM @DeliveryModelIds dmi
        where not exists (
          select 1
          from MyDb.Delivery i
          where i.StoreId = @StoreId
            and i.DeliveryModeId = dmi.ID
          );

错误消息应该已经为您提供了线索-您在
INSERT
中的表名后命名了两列,但随后给它一个
SELECT
,它只选择一个值。不确定
OUTPUT
子句此时是否要在这里执行。(是的,您选择了正确的方法向过程发送多个值)@TimHorton很乐意帮忙!