我正在学习在Microsoft SQL Server Management Studio中创建存储过程。我需要创建一个存储过程,将一条新记录添加到我的表中。另外,我需要创建两个额外的输出参数以及存储过程(我选择了@@error
和SCOPE_IDENTITY()
)。
这是我用来创建存储过程的代码:
use bieren
go
if exists
(select name from sysobjects
where name = 'spBierInsert' and xtype = 'p')
drop procedure spBierInsert
go
create procedure spBierInsert
@Biernr int = 0,
@Naam nvarchar(100) = '',
@BrouwerNr int = 0,
@SoortNr int = 0,
@Alcohol real,
@gelukt nvarchar(10) output,
@id int output
as
begin
declare @fout int
insert into bieren
values (@Biernr, @Naam, @BrouwerNr, @SoortNr, @Alcohol)
set @fout = @@error
print 'Foutnummer:' + cast(@fout as varchar(4))
if @fout > 0
set @gelukt = 'Neen: ' + cast(@fout as varchar(4))
else
set @gelukt = 'Ja'
set @id = SCOPE_IDENTITY()
end
我一定做错了,因为结果如下:
消息547,级别16,状态0,过程spBierInsert,第92行 INSERT语句与FOREIGN KEY约束冲突 “FK_Bieren_Brouwers”。冲突发生在数据库“Bieren”,表中 “dbo.Brouwers”,专栏“BrouwerNr”。 该语句已终止。 Foutnummer:547
(1行受影响)
我做错了什么?
EDIT 30/12/2015:我已用新信息更新了这个问题。我最初只是使用像“exampletable”这样的术语,因为我不知道对我的问题的答案的搜索会比单个答案更复杂,所以我继续前进并改变了上面的整个代码(以及文本)对于错误),我已经为我的表添加了脚本。这个问题的关键在于我提出了有效的代码,或者至少我理解它有什么问题。
USE [Bieren]
GO
/****** Object: Table [dbo].[Bieren] Script Date: 30/12/2015 0:19:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Bieren](
[BierNr] [int] NOT NULL,
[Naam] [nvarchar](100) NULL,
[BrouwerNr] [int] NULL,
[SoortNr] [int] NULL,
[Alcohol] [real] NULL,
CONSTRAINT [PK_Bieren] PRIMARY KEY CLUSTERED
(
[BierNr] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Bieren] WITH CHECK ADD CONSTRAINT [FK_Bieren_Brouwers] FOREIGN KEY([BrouwerNr])
REFERENCES [dbo].[Brouwers] ([BrouwerNr])
GO
ALTER TABLE [dbo].[Bieren] CHECK CONSTRAINT [FK_Bieren_Brouwers]
GO
ALTER TABLE [dbo].[Bieren] WITH CHECK ADD CONSTRAINT [FK_Bieren_Soorten] FOREIGN KEY([SoortNr])
REFERENCES [dbo].[Soorten] ([SoortNr])
GO
ALTER TABLE [dbo].[Bieren] CHECK CONSTRAINT [FK_Bieren_Soorten]
GO
答案 0 :(得分:3)
您的程序设置得很好。问题是您要在表'BrouwerNr'
的{{1}}列中插入一个值,该值在表"dbo.Brouwers"
的{{1}}列中不存在。名为"SoortNr"
的表"dbo.Soorten"
上有外来集,这会导致此限制。我建议您查看this文章,了解有关外键的更多信息。
答案 1 :(得分:0)
错误是因为您在@ColumnNr中插入1600,这是另一个表的外键,并且没有1600。
您可以执行以下操作:
右键单击" exampletable"表格并选择'脚本表格为' - >'创建到' - >'新的查询编辑器窗口'
现在,找到" ColumnNr"在里面。它将是这样的东西=>
ALTER TABLE [dbo].[exampleTable] WITH CHECK ADD CONSTRAINT [FK_exampleTable_**OtherTableName**_ColumnNr] FOREIGN KEY([ColumnNr])
REFERENCES [dbo].**[OtherTableName]** ([ColumnNr])
GO
现在在查询中打开提到的表" OtherTableName" ,然后查找" ColumnNr" 列。它的价值不会达到1600.
尝试在
中插入任何值@ColumnNr = {//Any value from **OtherTableName**},
位于表"OtherTableName"