【发布时间】:2018-07-22 04:34:48
【问题描述】:
我在创建存储过程以将项目插入我的数据库时遇到问题,存储过程还会检查项目是否存在,如果不存在则创建它们。
这是我的数据库图
这是我用于创建表的 SQL 代码(除了从表 MenuItem.MenuGroupID 添加到 MenuGroup.MenuGroupId 的外键)这将显示数据类型等。
use MenuDatabase
GO
CREATE TABLE Menu
(
MenuID int primary key identity (1,1),
MenuTitle varchar(200) null,
MenuDescriptionText varchar(200) null,
)
create table Menugroup
(
MenuGroupID int primary key identity (1,1),
MenuID int,
MenuGroupText varchar(200) null,
MenuGroupDescriptionText varchar(200) null,
)
create table MenuItem
(
MenuItemID int primary key identity (1,1),
MenuID int,
MenuGroupID varchar(200) null,
MenuItemCallNumber varchar(200) null,
MenuItemTitle varchar(200) null,
MenuItemDescriptionText varchar(200) null,
MenuItemNutritionText varchar(200) null,
MenuItemIngredientsText varchar(200) null,
MenuItemQuantity varchar(200) null,
MenuItemPreparationTime varchar(200) null,
MenuItmeCost varchar(200) null,
MenuItemTypeCode varchar(200) null,
MenuItemEthnicTypeCode varchar(200) null,
MenuItemAvailabilityBit varchar(200) null,
)
这是我正在为存储过程编写的 SQL 脚本。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_InsertNewMenuItem] (
@MenuItemTitle VARCHAR(200),
@MenuGroupText VARCHAR(200),
@MenuTitle VARCHAR(200)
)
AS
BEGIN
DECLARE @MenuCount INT
SET @MenuCount = (SELECT COUNT(*) FROM Menu WHERE MenuTitle = @MenuTitle)
DECLARE @MenuID INT
IF @MenuCount= 1
BEGIN
SET @MenuID = (SELECT MenuID FROM Menu WHERE MenuTitle = @MenuTitle)
END
ELSE
BEGIN
INSERT INTO Menu (MenuTitle) VALUES (@MenuTitle)
SET @MenuID = @@IDENTITY
END
DECLARE @MenuGroupCount INT
SET @MenuGroupCount = (SELECT COUNT(*) FROM MenuGroup WHERE MenuGroupText = @MenuGroupText)
DECLARE @MenuGroupID INT
IF @MenuGroupCount = 1
BEGIN
SET @MenuGroupID = (SELECT MenuGroupID FROM MenuGroup WHERE MenuGroupText = @MenuGroupText)
END
ELSE
BEGIN
INSERT INTO MenuGroup (MenuGroupText, MenuGroupID) VALUES (@MenuGroupText, @MenuID)
SET @MenuGroupID = @@IDENTITY
END
INSERT INTO MenuItem (MenuItemTitle)
VALUES (@MenuItemTitle)
INSERT INTO MenuGroup (MenuGroupText)
VALUES (@MenuGroupText)
INSERT INTO Menu (MenuTitle)
VALUES (@MenuTitle)
SET IDENTITY_INSERT MenuGroup OFF
END
GO
我目前在执行程序时在管理工作室中遇到以下错误
(1 row(s) affected)
Msg 544, Level 16, State 1, Procedure sp_InsertNewMenuItem, Line 36
Cannot insert explicit value for identity column in table 'MenuGroup' when IDENTITY_INSERT is set to OFF.
我需要尝试修复这些错误(我不明白它们为什么会发生),并确保该函数将执行所需的操作,即检查以下内容:
存储过程变量/字段|表字段|如果存在|如果不存在
MenuTitle varchar|菜单.菜单标题|获取 Menu.MenuID|插入,获取身份
Menu.MenuID| MenuGroupText varchar| MenuGroup.MenuGroupText|获取 MenuGroup.MenuGroupID|插入,获取标识 MenuGroup.MenuGroupID
MenuItem varchar|菜单项.菜单项标题|不要插入|插入
一个例子;
MenuTitle - 午餐菜单
MenuGroupText - 三明治
MenuItem - 加州鸡肉三明治
【问题讨论】:
-
前两个错误是因为你没有在@MenuGroupCount 上调用
DECLARE -
您在第 36 行
VALUES之后缺少一个左括号 -
好的,谢谢,我会修复和编辑以反映更改
-
非常感谢,似乎解决了问题
-
新错误:第一个是因为默认情况下你不能插入到表的主键列中,这很容易用
SET INDENTITY_INSERT ON修复第二个是因为一些外键规则你有,可能是因为你在复制价值
标签: sql-server stored-procedures