2016-07-20 5 views
0

Ich schreibe ein Migrationsskript, um Daten von einem Datenmodell zu einem anderen in Microsoft SQL Server Management Studio zu verschieben. Das Problem, auf das ich gestoßen bin, besteht darin, dass einige Tabellen in der Quelldatenbank Fremdschlüsselspalten enthalten, die ich vergleichen muss. Ein Code-Snippet:SQL Server: Verwenden von Spalten mit identischen Namen

INSERT INTO TargetDB.dbo.Encounter(EncounterID, PATID, DRG) 
Select 
visit_occurrence_id, 
person_id, 
(Select 
    Case when ((Select top 1 observation_concept_id from SourceDB.dbo.Observation where visit_occurrence_id = visit_occurrence_id) = 3040464) 
    Then (Select top 1 value_as_string from SourceDB.dbo.Observation where visit_occurrence_id = visit_occurrence_id) 
    Else NULL End 
) 
from SourceDB.dbo.Visit_occurrence 

Wie Sie sehen, muss ich in SourceDB.dbo.Observation vergleichen visit_occurrence_id in SourceDB.dbo.Visit_occurrence visit_occurrence_id. Wie es ist, gibt es nur Werte aus der ersten Zeile in SourceDB.dbo.Observation zurück, da visit_occurrence_id immer gleich ist.

Was ist der richtige Weg, dies zu tun? Kann ich den ersten visit_occurrence_id-Wert einer Variablen in der Abfrage zuweisen, sodass sie einen eindeutigen Namen hat? Ich bin hier ziemlich verloren.

+0

gerade voll qualifizieren den Namen: SourceDB.dbo.Observation.visit_occurence –

+0

Sie können auch Alias ​​der Tabelle: SourceDB.dbo.Observation AS A - dann verwenden A.visit_occurence in Ihrer WHERE –

+0

, dass das Ticket ist! Die erste Lösung hat perfekt funktioniert, danke! – JazzBullets

Antwort

0

Ich werde ein wenig mehr Details für Sie hier in einer Antwort hinzufügen. Sie können jederzeit auf ein Objekt verweisen, indem es vollständig qualifizierte Namen, aber es ist nicht immer notwendig:

Database.Schema.Table 

oder

Database.Schema.Table.Column 

mit SQL-Server, es auch Server für Linked-Server umfassen kann Szenarien.

gilt auch für andere Objekte wie Ansichten, Prozeduren, Funktionen, etc ... Aliasing von Tabellen und/oder Spalten kann eine gute Strategie zur Verkürzung dieser Qualifikation sein.

Immer wenn es Unklarheiten gibt, ist dies notwendig. Es ist jedoch eine gute Übung, ziemlich explizit zu sein, weil es Ihnen zukünftige Kopfschmerzen ersparen kann. Als Beispiel betrachten wir diese Ansicht:

CREATE VIEW vwEmployeesWithLocation AS 
SELECT 
    E.EmployeeId -- from employees 
    , LastName  -- from employees 
    , Status  -- from employees 
    , LocationName -- from locations 
FROM 
    Employees AS E 
    INNER JOIN 
    EmployeeLocations AS EL ON E.EmloyeeId = EL.EmployeeId 
    INNER JOIN 
    Locations AS L ON EL.LocationId = L.LocationId 

Gerade jetzt, alles ist in Ordnung, weil anders als EmployeeId, die Spaltennamen unterscheiden. Möglicherweise fügt jedoch jemand der Tabelle "Standorte" in Zukunft eine Statusspalte hinzu und bricht diese Ansicht. Daher wäre es besser, explizit das Tabellenpräfix für alle Spalten in der Auswahl einzufügen.

In Ihrem Fall ist Ihre Abfrage cross-Datenbank, also wieder, explizit über die Datenbank in allen Teilen Ihrer Abfrage.

0

Die Antwort snow_FFFFFF in den Kommentaren verwendet: Nur SourceDB.dbo.Observation.visit_occurence_id verwendet.

Verwandte Themen