Tak, jest to możliwe. Najpierw trzeba załadować dane do tabeli z kolumną Tożsamość:
-- 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
Rezultatem będzie:
id Country City
----------- -------------------- --------------------
1 U.S. New York
2 Washington
3 Baltimore
4 Canada Toronto
5 Vancouver
A teraz z odrobiną rekurencyjnej CTE magii można wypełnić brakujące dane:
;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)
Wynik:
Country City ID
-------------------- -------------------- -----------
U.S. New York 1
U.S. Washington 2
U.S. Baltimore 3
Canada Toronto 4
Canada Vancouver 5
Aktualizacja:
Jak Tab Alleman sugerowane poniżej ten sam rezultat można osiągnąć bez zapytania rekurencyjnego:
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, format pliku dla danych wejściowych jest to (jeśli chcesz spróbować skrypty zapisać dane wejściowe jako C: \ import.txt i plik formatu poniżej jako 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
jeśli nie masz innej kolumny, np. Id, aby pomóc w ustaleniu, do którego kraju należą te miasta, niemożliwe jest, aby DBMS dostał to, czego potrzebujesz. ponieważ nie są w porządku. –