SQL - 限制存储过程输入参数
问题描述:
我已经创建了此存储过程,它接受参数@UpdType char(1)
。无论输入什么参数,该过程都会执行。然而;如果参数是R
或U
,则存储过程仅完成其功能。SQL - 限制存储过程输入参数
是否有一种方法可以将存储过程限制为只接受参数R
或U
作为输入?
CREATE PROCEDURE UPDATECATS @UPDTYPE CHAR(1)
AS
BEGIN
IF @UPDTYPE = 'U' --UPDATE TO NEW CATEGORIES IF PARAMETER IS R
BEGIN
UPDATE CATLEVEL1
SET CAT1DESC = 'LABORATORY EQUIPMENT'
WHERE CAT1DESC = 'MEDICAL & ALLIED EQUIPMENT'
UPDATE CATLEVEL1
SET CAT1DESC = 'MACHINERY & CAMPUS EQUIPMENT'
WHERE CAT1DESC = 'OTHER MACHINERY & EQUIPMENT'
END
IF @UPDTYPE = 'R' --REVERSE TO OLD CATEGORIES IF THE PARAMETER IS U
BEGIN
UPDATE CATLEVEL1
SET CAT1DESC = 'MEDICAL & ALLIED EQUIPMENT'
WHERE CAT1DESC = 'LABORATORY EQUIPMENT'
UPDATE CATLEVEL1
SET CAT1DESC = 'OTHER MACHINERY & EQUIPMENT'
WHERE CAT1DESC = 'MACHINERY & CAMPUS EQUIPMENT'
END
IF @UPDTYPE = 'R' OR @UPDTYPE = 'U' --UPDATE THE CATEGORIES IN THE ASSETS TABLE
BEGIN
UPDATE ASSETS
SET ASSETS.CAT3 = B.CATLEVEL3LINK
FROM ASSETS A
LEFT JOIN ASSETDESC B ON A.ASDES = B.ASSETDESCRIPTION
UPDATE ASSETS
SET ASSETS.CAT2 = B.CATLEVEL2LINK
FROM ASSETS A
LEFT JOIN CATLEVEL3 B ON A.CAT3 = B.CAT3DESC
UPDATE ASSETS
SET ASSETS.CAT1 = B.CATLEVEL1LINK
FROM ASSETS A
LEFT JOIN CATLEVEL2 B ON A.CAT2 = B.CAT2DESC
END
END
答
的一种方式是添加简单的验证:
CREATE PROCEDURE UPDATECATS @UPDTYPE CHAR(1)
AS
BEGIN
IF @UPDTYPE IN ('R', 'U')
BEGIN
-- your code
END
ELSE
BEGIN
-- RAISERROR/THROW
END
END
或:
CREATE PROCEDURE UPDATECATS @UPDTYPE CHAR(1)
AS
BEGIN
IF (@UPDTYPE NOT IN ('R', 'U')) OR (@UPDTYPE IS NULL)
RAISERROR/THROW ..
--rest your code
END
答
你有一些选择。
选项1:从存储过程返回状态,并检查输入上的有效值。换句话说,这样的事情:
if (@UPDTYPE NOT IN ('R', 'D'))
begin
print 'Invalid argument';
return(-1);
end;
选项2:使用标志代替IsRUpd
。您可以声明这是bit not null
将其限制为两个值。
选项3:创建您自己的只接受这两个值的用户定义类型。
在我看来,第一种方法是最容易实现的方法。而且,在存储过程中进行适当的错误处理有许多更长期的好处。
'NOT INT'。您应该处理'NULL' [Demo](https://data.stackexchange.com/stackoverflow/query/451568) – lad2025
用户定义类型具有已知的可维护性问题,因此考虑到只有两个值,使用非空值位,就像IsRead好得多。使用位比验证要好,因为你的存储过程有一个更清晰明确的合同 - 并且在解释时检测到任何无效值,而不是运行。 – ironstone13