2016-07-04 2 views
1

Я получаю эту ошибку при обращении к хранимой процедуры в SQL Server:процедура ожидает параметр, который не поставляется в SQL

Процедура или функция «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

Мне любопытно, что касается процедуры «dbo.resetdata». Он ничего не сбрасывает; он просто добавляет новую строку. После вызова процедуры вы вставляете строку вручную, что предполагает, что вы ожидали, что она сделает что-то еще. Возможно, вы могли бы уточнить, что вы пытаетесь выполнить. – yelxe

ответ

1

Сообщение об ошибке означает, что именно он говорит: ваш 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.
0

Есть несколько вопросов здесь:

  1. Процедура EXEC не передавая необходимые параметры.
  2. Существует ограничение на Почтовом индексе, который будет завершаться 12345.

Правильного код для запуска хранимой процедуры будет:

EXEC [dbo].[resetdata] 
     @FirstName = 'F', 
     @LastName = 'L', 
     @PostCode = 123 
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, поэтому кажется, что t 5-значные числа действительны, но у вас есть контрольное ограничение, которое показывает, что PostCode должно быть 3 или 4-значной длины. Если 5 цифр действительны, обратите внимание на тип данных столбца PostCode, так как это максимальное значение - 32767.Поэтому, если вы хотите вставить запись с PostCode больше этого значения, вы получите сообщение об ошибке. Возможно, было бы лучше определить его как INT и контролировать его значение через Check Constraint, а также изменить текущее определение ограничения проверки в этом столбце.

Смежные вопросы