代码之家  ›  专栏  ›  技术社区  ›  Steven A. Lowe

如何定义具有可寻址成员的用户定义数据类型?

  •  1
  • Steven A. Lowe  · 技术社区  · 16 年前

    我在MS SQL Server数据库中有一个不寻常的建模情况:表的主键是由5个外键(固定大小)组成的多段“自然”键。

    我希望能够定义一个用户定义的数据类型来实现基于char(8)原语的数据结构,这样元素就可以作为单个字段进行寻址。

    例如(在错误的伪代码中):

    UDT seggy
    (
        seg1 char(2),
        seg2 char(1),
        seg3 char(1),
        seg4 char(2),
        seg5 char(2)
    )
    
    create table yotable
    (
        pkfield seggy NOT NULL,
        etc varchar(14),   --whatever etc.
    )
    with pkfield as the primary key,
    and also with seg1 as a foreign key to tableseg1,
    and also with seg2 as a foreign key to tableseg2,
    and so on
    

    然后能做这样的事情:

    insert into yotable (pkfield, etc) values ('abcdefgh','whatever')
    select * from yotable where seg2 = 'c'
    insert into yotable (seg1,seg2,seg3,seg4,seg5,etc)
        values ('ab','c','d','ef','gh', 'whatever')
    

    到目前为止我只找到了这个 CodeProject article 它不够深入或提供链接以获取更多信息 MSDN link .

    显然,我的google fu今晚很弱,任何链接/提示都非常感谢!

    替代标题:如何在SQL Server中模拟“覆盖”字段?

    假定/首选MS SQL Server 2005或更高版本。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Eric Rosenberger    16 年前

    您可以定义一个具有您想要的结构的clr udt,但是(1)您将无法保留外键(外键必须在列级别,而不是列中的udt字段),(2)实现clr udt并不容易(至少与伪代码中的内容相比)。另外,从您的描述来看,听起来它们在语义上是独立的列,而您要寻找的只是一个方便快捷的方式;在这种情况下,IMO UDT可能不是最好的方法。

    我建议保留单独的列,但是创建一个视图,该视图有一个将字段连接在一起的列,或者在表中创建一个执行相同操作的计算列。这将允许使用组合符号或单独符号进行搜索。然后,可以使用INSTEADOF触发器将组合列上的插入/更新分解为组件部件。