存储过程 - 接收一个 int 值 returns nvarchar
Stored Procedure - Receive an int value returns nvarchar
我想获得 NIC
名员工和 return 他们的 FirstName
、LastName
、ProfCategory
、AdmissionDate
。我创建了一个过程,但是当我尝试声明参数时,出现错误:
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
编写。如何列出所有 FirstName
、LastName
、ProfCategory
、AdmissionDate
的员工?
我试着这样写
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.
我想获得 NIC
名员工和 return 他们的 FirstName
、LastName
、ProfCategory
、AdmissionDate
。我创建了一个过程,但是当我尝试声明参数时,出现错误:
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
编写。如何列出所有 FirstName
、LastName
、ProfCategory
、AdmissionDate
的员工?
我试着这样写
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.