我在存储过程中声明了一个自定义类型的变量,但仍然得到错误“必须声明标量变量”

时间:2016-02-22 19:17:27

标签: sql-server tsql

我创建了一个自定义表格类型

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”。

1 个答案:

答案 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