首页 > 解决方案 > 插入 SQL Server 中的外键列表

问题描述

我正在尝试设置一个包含三个变量的存储过程

  1. FK_List
  2. String_of_Info
  3. 创建 ID

我需要从 FK_List 中为每个外键插入一个条目。我很好奇构建存储过程以有效执行此操作的最佳方法是什么。

编辑:添加了代码片段

CREATE PROCEDURE StackOverFlowExample_BulkAdd 
    @FKList VARCHAR(MAX),
    @Notes NVARCHAR(1000),
    @CreateId VARCHAR(50)
AS
BEGIN
    INSERT INTO [dbo].[StackOverflowTable] WITH (ROWLOCK)
           ([FKID], [Notes], [CreateId], [UpdateId])
    VALUES (@FKList, <---- this is the problem spot
            @Notes, @CreateId, @CreateId)
END
GO

标签: sqlsql-server

解决方案


根据您的评论,您只需要稍作修改

CREATE PROCEDURE StackOverFlowExample_BulkAdd 
    @Notes nvarchar(1000),
    @CreateId varchar(50)
AS
BEGIN
    INSERT INTO [dbo].[StackOverflowTable] WITH (ROWLOCK)
           ([FKID]
           ,[Notes]
           ,[CreateId]           
           ,[UpdateId])
     select
           someID
           ,@Notes
           ,@CreateId           
           ,@CreateId
     from FKListTable
END
GO

这是一个简单的演示

这将使用您传入的参数为引用表中的每个 FK 引用插入一行。这就是它的全部内容!

这是另一个演示,因为我使用 GUID 作为辅助表上的主键,所以可能更清楚。

第二次编辑

根据您的评论,您将需要一个字符串拆分器。我添加了一个由Jeff Moden创建的常见的。请参阅此处的示例

创建函数后的最终过程将如下所示。您需要将函数中的逗号更改为您的应用程序的分隔符。此外,您应该开始使用表值参数

CREATE PROCEDURE StackOverFlowExample_BulkAdd 
    @FKList VARCHAR(MAX),
    @Notes nvarchar(1000),
    @CreateId varchar(50)
AS
BEGIN
    INSERT INTO [dbo].[StackOverflowTable] WITH (ROWLOCK)
           ([FKID]
           ,[Notes]
           ,[CreateId]           
           ,[UpdateId])
    select item 
           ,@Notes
           ,@CreateId           
           ,@CreateId
    from dbo.DelimitedSplit8K(@FKList,',')
END

你可以这样称呼它:

declare @FKList varchar(1000) = '1,2,3,4,5,6'
declare @Notes varchar(1000) = 'here is my note'
declare @CreatedId int = 1

exec StackOverFlowExample_BulkAdd @FKList, @Notes, @CreatedId

推荐阅读