UDT的多种输入类型

时间:2013-03-01 11:09:13

标签: sql-server tsql sqldatatypes user-defined-types

我不知道我想做的事情是否可能,我只是好奇。

我有一个用户定义类型的MyType,它是一个TINYINT以及一个RULE,它声明允许的值必须介于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')

然后进行某种类型的转换,从'选择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

1 个答案:

答案 0 :(得分:0)

不,不幸的是,在普通的T-SQL中没有这样的事情。

您可以创建一个CLR用户定义的函数,该函数使用了sql_variant,然后在其中进行类型测试,但是,我会质疑它的必要性。通常,您希望在用户界面中运行的代码中进行此类转换,以便在到达业务逻辑层时准备好使用固定数据类型,更不用说数据库了。

顺便提一下,CREATE RULE已被弃用 - 并且已经在'此功能将在未来版本中删除'状态很长一段时间。到目前为止,我还没有看到任何可以让您在用户定义类型上定义CHECK约束的替代方法。这可能是它实际上还没有被弃用的部分原因。