过程需要SQL

时间:2016-07-04 19:05:54

标签: sql-server stored-procedures

我在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); 

3 个答案:

答案 0 :(得分:2)

错误消息的含义正是它所说的:您的SP期望声明三个参数。

这是您的SP标头定义:

create procedure [dbo].[resetdata]
    @FirstName varchar(50),
    @LastName varchar(50),
    @PostCode smallint

三个论点。他们都没有违约。

这就是你尝试执行它的方式:

EXEC dbo.resetdata;

没有提供任何参数。这会导致您的问题出错。传递参数以避免错误消息。

一些事情:

  • 如果您尝试将SP的脚本应用于测试数据库或数据库的其他副本,则必须使用USE A1修改第一行。我建议删除这一行。连接后选择DB,然后只运行当前数据库
  • 上的所有脚本
  • Insert INTO A1.dbo.Client - 关于不同数据库的相同注释以及另外一个 - 如果您已经在脚本开头使用USE A1定义了数据库,为什么要明确引用相同的数据库?如果你的SP和表应该在同一个DB中 - 不要指定DB。

答案 1 :(得分:0)

这里有几个问题:

  1. EXEC程序未传递所需参数。
  2. 邮政编码上的约束将因12345而失败。
  3. 运行存储过程的正确代码是:

       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控制它的值,并更改此列上的当前检查约束定义。