Sql server T-SQL检查列表是否有值,选择并插入到表中
我是T-SQL的新手,目前正在存储过程中处理insert语句:我在存储过程中使用INT类型的ID列表作为参数 如果列表不是空的,我想将id存储到表Delivery中 要传递ID列表,我使用表类型: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
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 | DeliveryModelId1………| 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很乐意帮忙!