【问题标题】:T-SQL Check if list has values, select and Insert into TableT-SQL 检查列表是否有值,选择并插入表
【发布时间】:2017-04-14 12:56:45
【问题描述】:

我对 T-SQL 还是很陌生,目前正在为我的存储过程中的插入语句苦苦挣扎:我在存储过程中使用 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;

如果列表有值,我想将值存储到数据库以及 StoreId 中,它始终为 1。

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

DeliveryId |商店 ID | DeliveryModelId
1.............| 1…………| 3
2.............| 1…………| 7
3.............| 1…………| 5

你知道如何解决这个问题吗?

谢谢!

【问题讨论】:

  • 错误消息应该已经为您提供了一个线索-您在INSERT 中的表名之后命名了两列,然后给它一个SELECT,它只选择一个值。不确定OUTPUT 子句目前是否打算在这里执行。 (是的,您选择了向程序发送多个值的正确方法)

标签: sql-server tsql stored-procedures


【解决方案1】:

您可以将@StoreId 添加到您的select 为您的insert

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

另外,如果您只想插入目标表中当前不存在的DeliveryModelId,您可以在where 子句中使用not exists(),如下所示:

...
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
          );

【讨论】:

  • @TimHorton 乐于助人!
【解决方案2】:

需要将INSERT语句修改为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多