SQL - 限制存储过程输入参数
SQL - Limiting stored procedure input parameters
我创建了这个接受参数 @UpdType char(1)
的存储过程。无论输入什么参数,该过程都会执行。然而;如果参数为 R
或 U
,则存储过程仅完成其功能。
有没有办法限制存储过程只接受参数 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:Return 来自存储过程的状态,并检查输入的有效值。换句话说,像这样:
if (@UPDTYPE NOT IN ('R', 'D'))
begin
print 'Invalid argument';
return(-1);
end;
选项 2:改为使用标志 IsRUpd
。您可以将其声明为 bit not null
以将其限制为两个值。
选项 3:创建您自己的只接受这两个值的用户定义类型。
在我看来,第一种方法是最容易实现的方法。而且,存储过程中的正确错误处理具有许多长期优势。
我创建了这个接受参数 @UpdType char(1)
的存储过程。无论输入什么参数,该过程都会执行。然而;如果参数为 R
或 U
,则存储过程仅完成其功能。
有没有办法限制存储过程只接受参数 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:Return 来自存储过程的状态,并检查输入的有效值。换句话说,像这样:
if (@UPDTYPE NOT IN ('R', 'D'))
begin
print 'Invalid argument';
return(-1);
end;
选项 2:改为使用标志 IsRUpd
。您可以将其声明为 bit not null
以将其限制为两个值。
选项 3:创建您自己的只接受这两个值的用户定义类型。
在我看来,第一种方法是最容易实现的方法。而且,存储过程中的正确错误处理具有许多长期优势。