我创建了一个自定义表格类型
Create type dbo.InsertPatient as table
(SSN Int,
LastUpdated Datetime,
PatientId varchar(50),
McdNo varchar(50),
mcrno varchar(50)
)
GO
我尝试使用此类型声明输入参数
Create PROCEDURE [dbo].[proc_PatientDt_Insert]
(
@PatientTable InsertPatient READONLY,
@FacilityID int,
@IsDeleted bit = 0
)
AS
BEGIN
SET NOCOUNT OFF
DECLARE @Err int
IF(@IsDeleted = 1)
BEGIN
DELETE FROM [Patient]
WHERE LTRIM(RTRIM([Patientid])) = LTRIM(RTRIM(@PatientTable.PatientId))
AND FacilityID = @FacilityID
RETURN
END
SET @Err = @@Error
RETURN @Err
END
当我尝试执行时,我收到此错误
消息137,级别16,状态1,过程proc_PatientDt_Insert,第18行
必须声明标量变量“@PatientTable”。
答案 0 :(得分:4)
错误消息有点误导,但这是因为你试图使用Table Varaible,好像它是一个普通的旧标量变量。表变量或多或少像表一样工作。虽然变量可能只有一行,但它可能有100.您需要从该变量SELECT
和/或JOIN
。如果你只想要有一行,或者想要任意第一行并忽略其他行,你可以改变
LTRIM(RTRIM([Patientid])) = LTRIM(RTRIM(@PatientTable.PatientId)) AND FacilityID=@FacilityID
到
LTRIM(RTRIM([Patientid])) = LTRIM(RTRIM(SELECT TOP 1 PatientId FROM @PatientTable)) AND FacilityID=@FacilityID
但你可能最好不要这样做:
DELETE p
FROM Patient p
INNER JOIN @PatientTable p2
ON LTRIM(RTRIM(p.PatientId) = LTRIM(RTRIM(p2.PatientId)
WHERE p.FacilityId = @FacilityId