Я хочу получить количество сотрудников NIC и вернуть их FirstName, LastName, ProfCategory, AdmissionDate. Я создал процедуру, но когда я пытаюсь объявить параметры, она говорит так:

Msg 137, уровень 15, состояние 2, строка 620 Необходимо объявить скалярную переменную «@FirstName».

Msg 137, уровень 15, состояние 2, строка 621 Необходимо объявить скалярную переменную «@FirstName».

Мой код SQL таков;

CREATE PROC sp_EmployeeNIC
    @NIC int,
    @FirstName nvarchar(30) output,
    @LastName nvarchar(30) output,
    @ProfCategory nvarchar(30) output,
    @AdmissionDate date output
AS
SELECT @FirstName = FirstName,@LastName = LastName ,@ProfCategory = ProfCategory, @AdmissionDate = AdmissionDate  FROM Employees
WHERE NIC = @NIC

DECLARE @FirstName nvarchar(30), @LastName nvarchar(30), @ProfCategory nvarchar(30), @AdmissionDate date
EXEC sp_EmployeeNIC 12345,@FirstName output, @LastName output, @ProfCategory output, @AdmissionDate output
SELECT @FirstName + ' ' + @LastName + ' ' + @ProfCategory + ' ' + @AdmissionDate 

И моя таблица сотрудников;

CREATE TABLE Employees (
    NIC int unique NOT NULL,
    FirstName nvarchar(30) NOT NULL, 
    LastName nvarchar(30) NOT NULL,
    ValidityNIC date NOT NULL,
    NIF int unique NOT NULL,
    IDNationality nvarchar(40) NOT NULL,
    FullAddress nvarchar(50) NOT NULL,
    PostalCode nvarchar(10) NOT NULL,
    DateOfBirth date NOT NULL,
    Username nvarchar(20) NOT NULL,
    Passw nvarchar(20) NOT NULL,
    Phone int NOT NULL,
    Email nvarchar(30) NOT NULL,
    ProfCategory nvarchar(30) NOT NULL,
    AdmissionDate date NOT NULL,
    EducationLv nvarchar(30) NOT NULL,
    Salary money NOT NULL,
    CONSTRAINT PK_eNic PRIMARY KEY (NIC),
    CONSTRAINT CK_BirthEmp CHECK ((YEAR(DateOfBirth))<(YEAR(GETDATE()))),
    CONSTRAINT FK_eNationality FOREIGN KEY (IDNationality) REFERENCES Nationalities (IDNationality)
)

-- Обновить

Так что я смог решить свою проблему благодаря ответу Дэвида. Теперь я пытаюсь получить NIC всех сотрудников вместо того, чтобы писать в качестве параметра 12345. Как я могу перечислить всех сотрудников: FirstName, LastName, ProfCategory, AdmissionDate?

Я пробовал писать вот так

go
DECLARE @NIC int, @FirstName nvarchar(30), @LastName nvarchar(30), @ProfCategory nvarchar(30), @AdmissionDate date


EXEC sp_EmployeeNIC @NIC,@FirstName, @LastName, @ProfCategory, @AdmissionDate
SELECT @NIC + ' ' + @FirstName + ' ' + @LastName + ' ' + @ProfCategory + ' ' + cast(@AdmissionDate  as varchar(20))

Но у меня есть значение NULL

0
dtaskin 10 Фев 2021 в 03:43

2 ответа

Лучший ответ

Если вы хотите вернуть всех сотрудников, а не только одну сетевую карту. Удалите входные и выходные параметры. Измените хранимую процедуру, чтобы вернуть набор результатов

CREATE PROC sp_EmployeeNIC
AS
BEGIN
    SELECT NIC, FirstName, LastName , ProfCategory, AdmissionDate  
    FROM   Employees
END

И выполнить хранимую процедуру

exec sp_EmployeeNIC

Боковое примечание: не называйте префикс хранимой процедуры sp_ см. ссылка

Избегайте использования префикса sp_ при именовании процедур. Этот префикс используется SQL Server для обозначения системных процедур. Использование префикса может привести к нарушению кода приложения, если существует системная процедура с таким же именем.

0
Squirrel 10 Фев 2021 в 02:10

То, что вы опубликовали, выглядит нормально, за исключением того, что вы никогда не завершали хранимую процедуру. Хранимая процедура продолжается до конца пакета. например

use tempdb
go
drop table if exists employees 

go
CREATE TABLE Employees (
    NIC int unique NOT NULL,
    FirstName nvarchar(30) NOT NULL, 
    LastName nvarchar(30) NOT NULL,
    ValidityNIC date NOT NULL,
    NIF int unique NOT NULL,
    IDNationality nvarchar(40) NOT NULL,
    FullAddress nvarchar(50) NOT NULL,
    PostalCode nvarchar(10) NOT NULL,
    DateOfBirth date NOT NULL,
    Username nvarchar(20) NOT NULL,
    Passw nvarchar(20) NOT NULL,
    Phone int NOT NULL,
    Email nvarchar(30) NOT NULL,
    ProfCategory nvarchar(30) NOT NULL,
    AdmissionDate date NOT NULL,
    EducationLv nvarchar(30) NOT NULL,
    Salary money NOT NULL,
    CONSTRAINT PK_eNic PRIMARY KEY (NIC),
    --CONSTRAINT CK_BirthEmp CHECK ((YEAR(DateOfBirth))<(YEAR(GETDATE()))),
    --CONSTRAINT FK_eNationality FOREIGN KEY (IDNationality) REFERENCES Nationalities (IDNationality)
    )

go
CREATE OR ALTER PROC sp_EmployeeNIC
    @NIC int,
    @FirstName nvarchar(30) output,
    @LastName nvarchar(30) output,
    @ProfCategory nvarchar(30) output,
    @AdmissionDate date output
AS
BEGIN
  SELECT @FirstName = FirstName,@LastName = LastName ,@ProfCategory = ProfCategory, @AdmissionDate = AdmissionDate  FROM Employees
  WHERE NIC = @NIC
END

go
DECLARE @FirstName nvarchar(30), @LastName nvarchar(30), @ProfCategory nvarchar(30), @AdmissionDate date
EXEC sp_EmployeeNIC 12345,@FirstName output, @LastName output, @ProfCategory output, @AdmissionDate output
SELECT @FirstName + ' ' + @LastName + ' ' + @ProfCategory + ' ' + cast(@AdmissionDate  as varchar(20))
0
David Browne - Microsoft 10 Фев 2021 в 00:51
66129343