2013-03-01 2 views
2

Я не знаю, возможно ли то, что я хочу сделать, или нет, и мне просто интересно.Несколько типов ввода для UDT

У меня опред.польз.имя Тип скажем MyType который является TINYINT наряду с правилом, которое гласит, что значение допустимого должно быть между 0 и 3.

-- Existing UDT & Rule which work 
CREATE TYPE [MySchema].[MyTypes] 
FROM [TINYINT] 

CREATE RULE [MySchema].[MyTypes_Rule] AS 
@Range BETWEEN 0 AND 3 

sp_bindrule 'MySchema.MyTypes_Rule', 'MySchema.MyTypes' 

То, что я хотел бы знать, было бы возможно добавить дополнительное правило/функциональность, которая позволила бы мне создать дополнительное правило, которое будет принимать значение NVARCHAR, и если оно находится в этом диапазоне, преобразуйте его в соответствующее значение TINYINT.

CREATE RULE [MySchema].[MyTypes_NVARCHAR_Rule1] AS 
@InValues IN (N'N', N'A', N'B', N'C') 

CREATE RULE [MySchema].[MyTypes_NVARCHAR_Rule1] AS 
@InValues IN (N'No Choice', N'Choice A', N'Choice B', N'Choice C') 

, а затем сделать некоторый тип преобразования из 'Choice A' или 'A' в значение 1, 'Выбор B' или 'B' в значение 2, и т.д., и т.д., и т.д.

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

CREATE TABLE [MyTable] 
([MyValue] BIT, 
    [Description] NVARCHAR(20)) 
GO 

INSERT INTO [MyTable] 
([MyValue], [Description]) 
SELECT 0, 'Enterered as 0' -- false 
UNION 
SELECT 1, 'Enterered as 1' -- true 
UNION 
SELECT CAST(0 AS BIT), 'Enterered as CAST(0 AS BIT)' -- false 
UNION 
SELECT CAST(1 AS BIT), 'Enterered as CAST(1 AS BIT)' -- true 
UNION 
SELECT CAST('false' AS BIT), 'Enterered as CAST(''false'' AS BIT)' -- false 
UNION 
SELECT CAST('true' AS BIT), 'Enterered as CAST(''true'' AS BIT)' -- true 

ответ

0

Нет, ничего подобного в простых T-SQL, к сожалению, нет.

Вы можете создать пользовательскую функцию CLR, которая взяла sql_variant, а затем проведет тестирование типа внутри этого вопроса, однако я бы поставил под сомнение необходимость в ней. Обычно вы хотите сделать такой перевод в коде, который работает в вашем пользовательском интерфейсе, так что вы готовы с фиксированным типом данных к моменту получения вашего уровня бизнес-логики, не говоря уже о вашей базе данных.

Кстати, CREATE RULE устарел - и эта функция долгое время была удалена в будущем состоянии. До сих пор я не видел альтернатив, которые позволили бы вам определить ограничение CHECK на определенные пользователем типы. Это может быть одной из причин, почему это еще не было устарело.

Смежные вопросы