2013-04-12 4 views
0

Я пишу некоторые хранимые процедуры для своего приложения. В коде C# у меня много перечислений. В качестве примера:Хранимая процедура SQL Server с значениями перечисления C#

public enum Status 
{ 
    Active = 1 
    Inactive = 2 
} 

Теперь, когда я пишу свои хранимые процедуры, есть ли способ репликации перечислений в базе данных? Я хочу, чтобы избежать использования таблицы, чтобы удержать их все, но мне было интересно, можете ли вы все их убрать в каком-либо объекте и ссылаться на это в других хранимых процедурах?

Так что я хочу, чтобы мои хранимые процедуры, чтобы использовать стиль:

SELECT * 
FROM Users 
WHERE status = Status.Active 

Вместо того, чтобы использовать сырые числовые значения, как это:

SELECT * 
FROM Users 
WHERE status = 1 

Кто-нибудь есть какие-либо идеи о том, как это могло бы быть достигнуто ?

+0

http://stackoverflow.com/questions/2947353/how-to-define-enum-in-sql-server-2005 проверить это может быть полезным для вас – KuldipMCA

ответ

1

Оказывается, лучший способ сделать это состоит в использовании функции SQL Server Скалярное для работы следующим образом:

ALTER FUNCTION [dbo].[fn_GetEnumValue] 

( @enumName VARCHAR (512) ) возвращает INT КАК НАЧАТЬ DECLARE @returnVal INT = 0

SELECT @returnVal = (
    CASE 
     WHEN @enumName = 'Active' THEN 1 
     WHEN @enumName = 'Inactive' THEN 2 

     ELSE 0 
    END 
) 

RETURN @returnVal 

END

Затем вы можете использовать его как это:

SELECT * FROM Users WHERE status = dbo.fn_GetEnumValue('Active'); 
0

Вы можете создать набор таблиц с одной строкой, каждый из которых представляет собой перечисление. Так что для пользователей статусов:

CREATE TABLE Enum_Status 
(
    Active TINYINT NOT NULL DEFAULT 1, 
    Inactive TINYINT NOT NULL DEFAULT 2 
); 
INSERT INTO Enum_Status VALUES(1 , 2 ); 

Тогда ваш ЗЕЬЕСТ будет выглядеть довольно аккуратный (если не так аккуратно, как эквивалент в Oracle):

SELECT Users.* 
    FROM Users, Enum_Status Status 
    WHERE status = Status.Active; 

держать вещи аккуратно, я бы соблазн поставить перечисления в их собственной схеме и предоставить всем пользователям соответствующие разрешения.

0

Как я понимаю, ваша цель - убедиться, что значение, переданное хранимой процедуре, действительно.

Вы можете создать таблицу состояния следующим образом

CREATE TABLE Status 
(
    StatusID int, 
    StatusName nvarchar, 
) 

вставить действительные данные здесь.

Затем, в вашем запросе, вы можете сделать INNER JOIN для проверки.

SELECT * 
FROM Users 
INNER JOIN Status ON Users.status = Status.StatusID 
WHERE StatusID = @StatusID