Question

J'ai une situation inhabituelle pour modéliser dans une base de données MS SQL Server: la clé primaire d'une table est une clé « naturelle » multi-segments composé de 5 clés étrangères (de tailles fixes)

.

je voudrais être en mesure de définir un type de données défini par l'utilisateur pour mettre en œuvre la structure de données basée sur un CHAR (8) primitif de telle sorte que les éléments sont adressables en tant que champs individuels.

Par exemple (dans le mauvais pseudocode):

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

et être en mesure de faire des choses comme ceci:

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

Jusqu'à présent, tout ce que j'ai trouvé est cette CodeProject article qui ne ne pas aller assez loin ou fournir des liens pour plus d'information, et ce rudimentaire lien MSDN .

Apparemment, mon google-fu est faible ce soir, tous les liens / conseils grandement appréciés!

Autre titre: comment simuler les champs 'overlay' dans SQL Server

MS SQL Server 2005 ou pris en charge / préféré plus tard.

Était-ce utile?

La solution

Vous pouvez définir un UDT CLR qui a la structure que vous voulez, mais (1) vous ne serez pas en mesure de garder les clés étrangères (clés étrangères doivent être au niveau de la colonne, pas un champ dans un UDT dans un colonne), et (2) il est trivial de mettre en œuvre un UDT CLR (au moins par rapport à ce qui est dans votre pseudo-code). De plus, à partir de votre description, on dirait qu'ils sont vraiment des colonnes distinctes sémantiquement, et ce que vous cherchez est juste un raccourci pour la commodité; OMI un UDT est probablement pas la meilleure approche dans ce scénario de toute façon.

Je suggère maintenant les colonnes distinctes, mais créer une impression qui a une colonne qui concaténer les champs ensemble, ou une colonne calculée dans le tableau qui fait la même chose. Cela permettra à la recherche en utilisant soit la notation combinée ou séparée. Vous pouvez ensuite utiliser un déclencheur INSTEAD OF pour décomposer un insert / mise à jour sur la colonne combinée dans les composants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top