1

我正在为我的应用程序编写一些存储过程。在 C# 代码中,我有很多枚举。举个例子:

public enum Status
{
    Active = 1
    Inactive = 2
}

现在,当我编写存储过程时,有没有办法在数据库中复制枚举?我想避免使用一张桌子来保存它们,但我想知道你是否可以将它们全部塞进某个对象中,并在其他存储过程中引用它?

所以我希望我的存储过程使用以下样式:

SELECT *
FROM Users
WHERE status = Status.Active

而不是像这样使用原始数值:

SELECT *
FROM Users
WHERE status = 1

有人对如何实现这一目标有任何想法吗?

4

3 回答 3

2

事实证明,最好的方法是使用 SQL Server Scalar 函数来完成这项工作,如下所示:

ALTER FUNCTION [dbo].[fn_GetEnumValue]

(@enumName varchar(512)) 开始声明时返回 INT @returnVal INT = 0

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

        ELSE 0
    END
)

RETURN @returnVal

结尾

然后你可以像这样使用它:

SELECT * FROM Users WHERE status = dbo.fn_GetEnumValue('Active');
于 2013-05-24T13:22:54.003 回答
1

您可以创建一组单行表,每个表代表一个枚举。所以对于用户状态:

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

然后您的 SELECT 语句看起来会很整洁(如果不像 Oracle 中的等效语句那么简洁):

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

为了保持整洁,我很想将枚举表放在它们自己的模式中,并授予所有用户相关权限。

于 2013-04-12T13:25:58.207 回答
0

As i understand, your aim is to ensure that the value passed to the stored procedure is valid.

You could create a Status table as follows

CREATE TABLE Status
(
    StatusID int,
    StatusName nvarchar,
)

insert the valid data here.

Then, in your query, you could do an INNER JOIN to validate.

SELECT *
FROM Users
INNER JOIN Status ON Users.status = Status.StatusID
WHERE StatusID = @StatusID
于 2013-04-12T14:03:14.123 回答