1

我已經創建了此存儲過程,它接受參數@UpdType char(1)。無論輸入什麼參數,該過程都會執行。然而;如果參數是RU,則存儲過程僅完成其功能。SQL - 限制存儲過程輸入參數

是否有一種方法可以將存儲過程限制爲只接受參數RU作爲輸入?

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 

回答

3

的一種方式是添加簡單的驗證:

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 
2

你有一些選擇。

選項1:從存儲過程返回狀態,並檢查輸入上的有效值。換句話說,這樣的事情:

if (@UPDTYPE NOT IN ('R', 'D')) 
begin 
    print 'Invalid argument'; 
    return(-1); 
end; 

選項2:使用標誌代替IsRUpd。您可以聲明這是bit not null將其限制爲兩個值。

選項3:創建您自己的只接受這兩個值的用戶定義類型。

在我看來,第一種方法是最容易實現的方法。而且,在存儲過程中進行適當的錯誤處理有許多更長期的好處。

+0

'NOT INT'。您應該處理'NULL' [Demo](https://data.stackexchange.com/stackoverflow/query/451568) – lad2025

+0

用戶定義類型具有已知的可維護性問題,因此考慮到只有兩個值,使用非空值位,就像IsRead好得多。使用位比驗證要好,因爲你的存儲過程有一個更清晰明確的合同 - 並且在解釋時檢測到任何無效值,而不是運行。 – ironstone13