2012-01-18 113 views
1

有沒有辦法限制SQL Server 2008中存儲過程參數的值?這是一個varchar。例如。我希望它只是'生產','發展'或'質量保證'。如果有人通過「Prod」,「Dev」,「UAT」或其他任何內容,我希望它會誤報。在SQL Server中限制存儲過程參數值

+0

您是否嘗試過在存儲過程本身中添加驗證邏輯?例如。檢查參數的值,如果不符合標準,則使用RAISE ERROR。 – RobJohnson 2012-01-18 15:05:59

回答

5
CREATE PROC SomeProc 
    @par VARCHAR(50) 
AS 
BEGIN 

    IF @par NOT IN ('Production', 'Development', 'QA') 
    RAISERROR(N'Your Message',16,1) 

    -- MORE CODE HERE 

END 

您可以通過使用表中查找有效值範圍的解決方案。

0

結合使用IF區塊和RAISEERROR關鍵字,您應該可以完成您想要的功能。

但是,這種限制聽起來像它屬於您的應用程序與您的存儲過程。

+0

不同意最後一行。如果程序預計將被調用並且來自特定列表的參數似乎是完全合理的,如果一些廢話通過而不是默認默認或失敗,則會引發錯誤。 – 2012-01-18 15:09:23

+0

我認爲它是一個公平點,我將SP邏輯限制爲僅限CRUD並且具有應用程序處理輸入驗證。在所有應用程序都受到源代碼控制,版本控制,代碼評論等的影響之後,SP邏輯經常會被忽視並變得難以調試。 – RobJohnson 2012-01-18 15:34:50

+0

@MartinSmith - 除非存儲過程在命令行中或由管理員使用類似Management Studio的命令執行,否則我不明白爲什麼在存儲過程中需要此邏輯。您所描述的內容可以非常容易地在可以隱藏業務邏輯的應用程序中實現。 – 2012-01-18 15:37:10

0

我能想到做到這一點的唯一方法是自己手動檢查值。作爲一個粗略的例子,如:

CREATE PROCEDURE [dbo].[MyProcedure] 
    @value varchar(32) 
AS 
BEGIN 

    declare @isAllowed bit = 0 
    if @value in ('Hello', 'World') 
     set @isAllowed = 1 

    if @isAllowed begin 
     -- Do work here 
    end 
    else begin 
     -- Send error here 
    end 

END