了解创建简单存储过程

时间:2015-12-27 15:28:44

标签: sql sql-server stored-procedures

我正在学习在Microsoft SQL Server Management Studio中创建存储过程。我需要创建一个存储过程,将一条新记录添加到我的表中。另外,我需要创建两个额外的输出参数以及存储过程(我选择了@@errorSCOPE_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

2 个答案:

答案 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"