Frage

Ich habe eine ungewöhnliche Situation in einer MS SQL Server-Datenbank zu modellieren: der Primärschlüssel einer Tabelle ist ein Multi-Segment ‚natürlicher‘ Schlüssel bestand aus 5 Fremdschlüsseln (von festgelegten Größen)

.

Ich möchte in der Lage sein, einen benutzerdefinierten Datentyp zu definieren, die Datenstruktur zu implementieren, basierend auf einer CHAR (8) primitiven derart, dass die Elemente adressierbar sind als einzelne Felder.

Zum Beispiel (in einem schlechten Pseudo-Code):

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

und dann in der Lage sein, solche Dinge zu tun:

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

Bisher alles, was ich gefunden habe, ist diese Codeproject Artikel die tut weit genug oder bieten Links für weitere Informationen nicht gehen, und diese rudimentäre MSDN Link .

Offenbar mein Google-Fu schwach heute Abend ist, werden alle Links / Hinweise sehr dankbar!

Alternate Titel: Wie 'Overlay' Felder in SQL Server zu simulieren

MS SQL Server 2005 oder höher angenommen / bevorzugt.

War es hilfreich?

Lösung

Sie können eine CLR UDT definieren, die die Struktur, die Sie wollen, aber (1) Sie halten die Lage sein, den Fremdschlüssel nicht (Fremdschlüssel auf Spaltenebene sein, nicht ein Feld in einem UDT in einem Spalte), und (2) es ist nicht trivial, eine CLR UDT (zumindest zu implementieren im Vergleich zu dem, was in Ihrem Pseudo-Code ist). Plus, aus Ihrer Beschreibung, klingt es wie sie wirklich sind separate Spalten semantisch, und was Sie suchen, ist nur eine Abkürzung für Bequemlichkeit; IMO ein UDT ist wahrscheinlich nicht der beste Ansatz in diesem Szenario trotzdem.

Ich würde vorschlagen, die einzelnen Spalten zu halten, sondern schaffen auch eine Ansicht, die eine Spalte hat, die die Felder zusammen verkettet, oder eine berechnete Spalte in der Tabelle, die das gleiche tut. Dies erlaubt entweder die kombinierte oder getrennte Schreibweise zu suchen. Anschließend können Sie einen INSTEAD OF-Trigger verwenden, um ein insert / update auf der kombinierten Spalte in die Komponententeile zu zerlegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top