2012-01-18 5 views
1

Есть ли способ ограничить значения параметров хранимой процедуры в SQL Server 2008? Это варчар. Например. Я желаю, чтобы это было только «Производство», «Развитие» или «ОК». Я хочу, чтобы он ошибся, если кто-то передает «Prod», «Dev», «UAT» или что-то еще.Ограничение значений хранимой процедуры в SQL Server

+0

Вы пытались добавить логику проверки в рамках самой хранимой процедуры? Например. проверьте значение параметра и используйте RAISE ERROR, если он не соответствует вашим критериям. – RobJohnson

ответ

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

Не соглашайтесь с последней строкой. Если процедура, которую, как ожидается, вызывается с параметром из определенного списка, кажется совершенно разумной, чтобы вызвать ошибку, если какая-то глупость прошла, а не предполагать по умолчанию или терпеть неудачу. –

+0

Я думаю, что это справедливая точка, я бы ограничил логику SP только CRUD и проверил проверку ввода дескриптора приложения. В конце концов, приложение подпадает под контроль источника, контроль версий, обзоры кода и т. Д., Где логика SP часто остается незамеченной и становится трудно отлаживать. – RobJohnson

+0

@MartinSmith. Если хранимая процедура не выполняется в командной строке или администраторами, использующими что-то вроде Management Studio, я не понимаю, почему эта логика необходима в хранимой процедуре. То, что вы описали, может быть легко реализовано в приложении, где бизнес-логику можно скрыть. –

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 
Смежные вопросы