【问题标题】:Multiple input types for a UDTUDT 的多种输入类型
【发布时间】:2013-02-15 20:50:51
【问题描述】:

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

我有一个用户定义类型,比如 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,“Choice 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

【问题讨论】:

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


    【解决方案1】:

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

    您可以创建一个采用 sql_variant 的 CLR 用户定义函数,然后在其中进行类型测试,但是,我会质疑它的必要性。通常你会希望在你的用户界面中运行的代码中进行这种翻译,这样当你到达业务逻辑层时,你就可以使用固定的数据类型了,更不用说你的数据库了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多