2017-05-19 4 views
0

Ich habe eine Tabelle, DD, die ein Datenwörterbuch ist, mit Feldern (sagen wir):Ist es in SQL Server möglich, den Typ eines Felds basierend auf dem Inhalt eines anderen Felds zu konvertieren?

ColumnID (longint PK), ColumnName (varchar), Datatype (varchar) 

Ich habe eine weitere Tabelle, V, wo ich Sätze von Datensätzen in der Form haben:

ColumnID (longint FK), ColumnValue (varchar) 

ich möchte in der Lage sein, Gruppen von Datensätzen von V in eine andere Tabelle zu konvertieren, Ergebnisse, wobei jedes Feld wird auf der Grundlage der Wert von DD.Datatype übersetzt werden, so dass die Zieltabelle (sagen wir) sein könnte:

ColumnID (longint FK), ColumnValue (datetime) 

Um in der Lage zu sein, dies zu tun, ISTM, die ich brauche

CONVERT(value of DD.Datatype, V.ColumnValue) 
wie

etwas in der Lage sein zu tun

Kann jemand mir irgendwelche Hinweise darauf, ob dies überhaupt möglich, und wenn ja, was die Syntax wäre? Mein Google-Fu hat sich als unzureichend erwiesen, um irgendetwas relevantes zu finden

+1

Jede * bestimmte * Abfrage erzeugt immer Ergebnismengen mit einer festen "Form" - die Anzahl der Spalten, ihre Namen und ihre * Typen *. Sie können sicherlich nicht haben, was in Ihrer Frage hier impliziert wird - ein Ergebnis, das möglicherweise mit jeder * Zeile * versehen ist, die eine Spalte mit Werten verschiedener Typen enthält. –

+0

Ja, das verstehe ich. Ich möchte eine de-normalisierte Ansicht einer übergeordneten Tabelle und eine Gruppe von Datensätzen in einer untergeordneten Tabelle erstellen. Also, mit meinen ursprünglichen Namen, hätte ich 1 Datensatz in der Elterntabelle und eine Reihe von Datensätzen in * V *, die Attribute dieses Elternteils sind; meine Ausgabe wäre eine Tabelle * Ergebnisse *, die die Felder von Eltern * und * 1 Feld von jedem Datensatz in * V * enthielt, die ein Kind des Elterndatensatzes war – khafka

+0

Vielleicht, wenn Sie Details über die Quelldaten und die gewünschte Ausgabe bereitstellen können wir können helfen. Hier ist ein großartiger Ort, um anzufangen. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

Antwort

1

Sie könnten so etwas mit dynamischen SQL, sicherlich tun. Solange Sie sich der Einschränkung bewusst sind, dass der Datentyp eine Eigenschaft der Spalte in der Ergebnismenge ist und nicht jede Zelle in der Ergebnismenge. Daher müssen alle Zeilen in einer bestimmten Spalte den gleichen Datentyp haben.

0

Der einzige Weg, um etwas wie CONVERT(value of DD.Datatype, V.ColumnValue) in SQL zu erreichen, ist mit dynamischem SQL. Das hat seine eigenen Probleme, wie etwa die Notwendigkeit, gespeicherte Prozeduren zu verwenden, um Abfragen effizient zu halten.

Alternativ könnten Sie die Metadaten des Datentyps mit einer Abfrage abrufen, eine neue Abfrage in Ihrer Anwendung erstellen und anschließend die Datenbank erneut abfragen. Vorausgesetzt, dass Sie SQL Server verwenden 2012+, könnten Sie auch versuchen, TRY_CAST() oder TRY_CONVERT() verwenden, und das Schreiben der Abfrage wie:

SELECT TRY_CAST(value as VARCHAR(2)) FieldName 
FROM table 
WHERE datatype = 'VARCHAR' AND datalength = 2 

Aber noch einmal, Sie haben wissen, was die gültigen Typen sind; Sie können das nicht dynamisch mit SQL ohne dynamisches SQL ermitteln. Variablen und Parameter dürfen nicht für Objekt- oder Typnamen verwendet werden. Unabhängig davon, was Sie tun, müssen Sie jedoch daran denken, dass alle Daten in einer bestimmten Spalte einer Ergebnismenge den gleichen Datentyp haben müssen.

Most Entity-Attribute-Value tables wie diese Opfer Datenintegrität, die starke Typisierung bringt durch die Annahme, dass der Datentyp von der Anwendung und nicht das RDBMS bestimmt wird. EAV erlaubt dir nicht, deinen Kuchen zu haben (Daten ohne ein festes Schema zu speichern) und es auch zu essen (genießt, dass DB starke Datentypen erzwingt, keine Zeichenketten in der Anwendung schreiben, etc.).

EAV bricht Daten Normalisierung ziemlich schlecht. Es bricht die erste Normalform; die grundlegendste Regel, und das ist nur eine der Konsequenzen. EAV-Tabellen werden das Abfragen der Daten von schwierig bis extrem schwierig machen, und Sie werden fast immer die Leistung opfern, weil das RDBMS auf dem relationalen Modell basiert.

Das bedeutet nicht, dass Sie nie EAV-Tabellen verwenden sollten. Sie sind relativ groß für benutzerdefinierte Felder. Es bedeutet jedoch, dass sie immer zu saugen, um zu fragen und zu verwalten sind. Das ist nur der Kompromiss. Du hast die erste Normalform gebrochen. Abfrage und Leistung werden Konsequenzen dieser Wahl haben.

Wenn Sie Ihre alle Ihre Daten so speichern möchten, sollten Sie entweder Daten als Blobs von XML oder JSON (SQL Server 2016) speichern - aber das ist ein allgemeiner Schmerz zu Abfrage - oder verwenden ein NoSQL-Datenspeicher wie MongoDB oder Cassandra anstelle eines SQL-RDBMS.

+0

Dank @Bacon Bits, das ist mir mehrere Dinge gegeben, darüber nachzudenken - insbesondere, ob es sein würde besser, um die Daten als XML oder JSON zu speichern, anstatt Sätze von Datensätzen in einer untergeordneten Tabelle, da ich deutliche Vorteile für den XML/JSON-Ansatz sehen kann. Die Abfrageleistung kann oder darf kein Problem sein, und ich muss darüber nachdenken - in einem Sinne, ich baue eine große Daten-Dump, die spezifische Transformation benötigt, um Client-Anwendungen als Teil ihrer nützlich sein Design; Auf der anderen Seite wäre es in den meisten Fällen offensichtlich besser, die Daten direkt nutzbar zu machen – khafka

Verwandte Themen