我正在尝试设置一个具有三个变量的存储过程
我需要从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
答案 0 :(得分:1)
根据您的评论,您只需要稍作修改
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参考插入一行,其中包含您传入的参数。仅此而已!
Here's another demo可能会更清楚,因为我在辅助表上的主键上使用了GUID。
第二编辑
根据您的评论,您将需要一个字符串分隔符。我添加了一个由Jeff Moden创建的通用对象。 See the example here
创建函数后,最终过程将如下所示。您需要将函数中的逗号更改为应用程序的分隔符。另外,您应该开始使用table valued parameters。
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