Ja, es ist möglich. Zuerst müssen Sie die Daten in eine Tabelle mit einer Identity-Spalte laden:
-- drop table #t
CREATE TABLE #t (id INTEGER IDENTITY PRIMARY KEY,
Country VARCHAR(20),
City VARCHAR(20))
INSERT INTO #t(Country, City)
SELECT a.Country, a.City
FROM OPENROWSET(BULK 'c:\import.txt',
FORMATFILE = 'c:\format.fmt',
FIRSTROW = 2) AS a;
select * from #t
Das Ergebnis wird:
id Country City
----------- -------------------- --------------------
1 U.S. New York
2 Washington
3 Baltimore
4 Canada Toronto
5 Vancouver
Und jetzt mit einem wenig rekursive CTE Magie können Sie die fehlenden Details füllen:
;WITH a as(
SELECT Country
,City
,ID
FROM #t WHERE ID = 1
UNION ALL
SELECT COALESCE(NULLIF(LTrim(#t.Country), ''),a.Country)
,#t.City
,#t.ID
FROM a INNER JOIN #t ON a.ID+1 = #t.ID
)
SELECT * FROM a
OPTION (MAXRECURSION 0)
Ergebnis:
Country City ID
-------------------- -------------------- -----------
U.S. New York 1
U.S. Washington 2
U.S. Baltimore 3
Canada Toronto 4
Canada Vancouver 5
Update-
:
Wie Tab Alleman unter dem gleichen Ergebnis legte nahe, ohne die rekursive Abfrage erreicht werden:
SELECT ID
, COALESCE(NULLIF(LTrim(a.Country), ''), (SELECT TOP 1 Country FROM #t t WHERE t.ID < a.ID AND LTrim(t.Country) <> '' ORDER BY t.ID DESC))
, City
FROM #t a
BTW, die Formatdatei für Ihre Eingangsdaten ist dies (wenn Sie wollen versuchen, die Skripte speichern die Eingabedaten als c: \ import.txt und die Formatdatei im folgenden als c: \ format.fmt):
9.0
2
1 SQLCHAR 0 11 "" 1 Country SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 "\r\n" 2 City SQL_Latin1_General_CP1_CI_AS
Wenn Sie keine andere Spalte wie ID haben, um herauszufinden, zu welchem Land die Städte gehören, ist es für DBMS unmöglich zu bekommen, was Sie brauchen. weil sie nicht in Reihenfolge gehen. –