在我的sql代码中,我传递了许多神奇的数字: -
AnimalType TINYINT
/*
AnimalType can be one of the following :-
1. Cat
2. Dog
3. Bird
....
*/
无论如何,我可以将其设为自定义类型/枚举。 例如。
AnimalType ANIMAL
并且它被限制为包含1< - >之间的数字。无论如何(例如我上面例子中的3)。
或约束到字符串。例如。 AnimalType ='Cat'..等等?
干杯!
我知道LookUp表是什么。这不是用于查找表,而是用于传递给许多存储过程的一些数据。我希望传入一个枚举或至少一些有约束的数字(例如数字1< - > 5)等,而不是传入 Magic Numbers ...
答案 0 :(得分:8)
没有枚举类型。但是,您可以创建用户定义的函数,以便在映射到枚举值的INT之间来回转换。
要为基于'INT'的AnimalType生成友好名称,您可以执行以下操作:
UDF生成友好名称:
CREATE FUNCTION ihAnimalTypeDesc
(
@AnimalType INT
)
RETURNS VARCHAR(20)
AS
BEGIN
IF @AnimalType IS NULL
RETURN NULL
DECLARE @Temp AS VARCHAR(20)
SET @Temp = CASE @AnimalType
WHEN 1 THEN 'Cat'
WHEN 2 THEN 'Dog'
WHEN 3 THEN 'Snake'
END
RETURN @Temp
END
SELECT
语句可以像这样使用UDF:
SELECT A.AnimalName, dbo.ihAnimalTypeDesc(A.AnimalType)
FROM Animals A
如果动物属于特定类型,这是一个返回true或false的UDF:
CREATE FUNCTION IsCat
(
@AnimalType INT
)
RETURNS BIT
AS
BEGIN
IF @AnimalType IS NULL
RETURN NULL
IF @AnimalType = 1
RETURN 1
RETURN 0
END
以下是使用上述UDF的示例。注意:在WHERE
子句中执行此操作时,您必须小心性能问题。:
SELECT AnimalName
FROM Animals
WHERE dbo.IsCat(AnimalType)
答案 1 :(得分:4)
枚举类似于表的FOREIGN KEY
,但没有表格。
创建表格并制定FOREIGN KEY
约束:
CREATE TABLE AnimalType (id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL)
CREATE TABLE Animal (
id INT NOT NULL PRIMARY KEY,
type INT NOT NULL,
name VARCHAR(50) NOT NULL,
CONSTRAINT FK_animal_type FOREIGN KEY (type) REFERENCES AnimalType(id)
)
答案 2 :(得分:4)
您可以尝试添加以下内容:
CREATE VIEW AnimalType AS
SELECT
10 AS Cat
,20 AS Dog
,30 AS Bird
使用它:
DECLARE @animal INT
SELECT @animal = Bird FROM AnimalType
答案 3 :(得分:1)
根据您的最新编辑,关于需要传递参数。除了繁重的SQL之外,T-SQL还有简单的基础知识。没有枚举数据类型。如果这是您想要的,您可以通过以下方式处理它:
create procedure YourProcedure
( @param1 int
,@param2 varchar(5)
,@param3 varchar(5)
)
as
DECLARE @Value3 int
IF @param1 IS NULL OR @param1<1 OR @param1>5
BEGIN
return 1 --error out of range param
END
IF NOT EXISTS (SELECT Value FROM LookUpTable WHERE Value=@param2)
BEGIN
return 2 --error out of range param
END
SELECT @Value3=IntValue FROM OtherLookupTable WHERE StrValue=@param3
IF @Value3 IS NULL
BEGIN
return 3 --error out of range param
END
--do work here
go