我在SQL Server中访问存储过程时遇到此错误:
程序或功能' resetdata'期望参数' @ FirstName',这是未提供的。
这是我的表:
CREATE TABLE dbo.Client
(
ClientID int IDENTITY(1,1) PRIMARY KEY NOT NULL,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
StreetAddress VARCHAR(50) NULL,
Suburb VARCHAR(15)NULL,
C_State VARCHAR(3) NULL, --CHECK (C_State IN ('QLD', 'NSW', 'VIC', 'TAS', 'SA', 'WA', 'NT', 'ACT')),
PostCode SMALLINT NOT NULL,
PhoneNumber VARCHAR(11) NULL,
);
GO
ALTER TABLE Client
ADD CONSTRAINT state_ CHECK (C_State IN ('QLD', 'NSW', 'VIC', 'TAS', 'SA', 'WA', 'NT', 'ACT')),
CONSTRAINT check_post_code CHECK ([PostCode] LIKE '[0-9][0-9][0-9][0-9]' or [PostCode] LIKE '[0-9][0-9][0-9]');
GO
这是我的存储过程:
CREATE PROCEDURE [dbo].[resetdata]
@FirstName varchar(50),
@LastName varchar(50),
@PostCode smallint
AS
BEGIN
INSERT INTO A1.dbo.Client (FirstName, LastName, PostCode)
VALUES(@FirstName, @LastName, @PostCode)
END;
GO
EXEC dbo.resetdata;
INSERT INTO Client(FirstName, LastName, PostCode)
VALUES ('F', 'L', 12345);
答案 0 :(得分:2)
错误消息的含义正是它所说的:您的SP期望声明三个参数。
这是您的SP标头定义:
create procedure [dbo].[resetdata]
@FirstName varchar(50),
@LastName varchar(50),
@PostCode smallint
三个论点。他们都没有违约。
这就是你尝试执行它的方式:
EXEC dbo.resetdata;
没有提供任何参数。这会导致您的问题出错。传递参数以避免错误消息。
一些事情:
USE A1
修改第一行。我建议删除这一行。连接后选择DB,然后只运行当前数据库Insert INTO A1.dbo.Client
- 关于不同数据库的相同注释以及另外一个 - 如果您已经在脚本开头使用USE A1
定义了数据库,为什么要明确引用相同的数据库?如果你的SP和表应该在同一个DB中 - 不要指定DB。 答案 1 :(得分:0)
这里有几个问题:
运行存储过程的正确代码是:
EXEC [dbo].[resetdata]
@FirstName = 'F',
@LastName = 'L',
@PostCode = 123
答案 2 :(得分:0)
试试这个:
USE A1;
GO
create procedure [dbo].[resetdata]
@FirstName varchar(50),
@LastName varchar(50),
@PostCode smallint
AS
BEGIN
Insert INTO A1.dbo.Client (FirstName,LastName,PostCode)
VALUES(@FirstName,@LastName,@PostCode)
END;
GO
EXEC dbo.resetdata @FirstName='F', @LastName='L', @PostCode=12345
--INSERT INTO Client(FirstName,LastName,PostCode) VALUES ('F','L',12345); No need to this Insert
注意:在示例数据中,您要将12345
插入PostCode
列,因此看起来5位数字有效,但您有检查约束条件节目PostCode
应为3或4位长。如果5位有效,请注意PostCode
列的数据类型,因为它的最大值为32767。因此,如果要插入PostCode
大于此值的记录,则会出现错误。可能最好将其定义为INT
并通过Check Constraint控制它的值,并更改此列上的当前检查约束定义。