存储过程 - 接收一个 int 值 returns nvarchar

Stored Procedure - Receive an int value returns nvarchar

我想获得 NIC 名员工和 return 他们的 FirstNameLastNameProfCategoryAdmissionDate。我创建了一个过程,但是当我尝试声明参数时,出现错误:

Msg 137, Level 15, State 2, Line 620
Must declare the scalar variable "@FirstName"

Msg 137, Level 15, State 2, Line 621
Must declare the scalar variable "@FirstName"

我的SQL代码是这样的;

CREATE PROCEDURE 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

我用这个 SQL 语句调用这个存储过程:

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 

这是我的 table 名员工:

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 编写。如何列出所有 FirstNameLastNameProfCategoryAdmissionDate 的员工?

我试着这样写

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

您发布的内容看起来不错,只是您从未终止存储过程。存储过程一直持续到批处理结束。例如

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))

如果您想要 return 所有员工而不只是一个 NIC。删除输入和输出参数。把存储过程改成return一个结果集

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

并执行存储过程

exec sp_EmployeeNIC

旁注:避免使用 sp_ 命名存储过程前缀,请参阅 reference

Avoid the use of the sp_ prefix when naming procedures. This prefix is used by SQL Server to designate system procedures. Using the prefix can cause application code to break if there is a system procedure with the same name.