2013-03-01 59 views
2

我不知道我想要做什么是可能的,但我只是好奇而已。UDT的多种输入类型

我有发言权的MyType的用户定义类型是一个TINYINT与规定允许的值必须是我想什么3,介于0和

-- 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') 

,然后做一些类型转换的从“选择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已被弃用 - 并且一直处于'此功能将在未来版本中删除'状态很长一段时间。到目前为止,我还没有看到任何可以让你定义用户定义类型约束的替代方案。这可能是它尚未被实际弃用的一些原因。