2009-08-26 15 views
6

Od dłuższego czasu prowadzę dochodzenie i uderzam w mur. Importuję z plików xls do tabel tymczasowych za pomocą komendy OpenRowset. Teraz mam problem, w którym próbuję zaimportować pewną kolumnę ma zakres wartości, ale najczęściej są następujące. Kolumny zbudowane w postaci długich liczb, tj. 15598, a niektóre kolumny jako struny, tj. 15598-E.Komenda OpenRowSet w TSQL wraca NULLS

Teraz openrowset czyta wersję ciągową bez problemu, ale zgłasza numer wersji jako NULL. Przeczytałem (http://www.sqldts.com/254.aspx), że openrowset ma ten problem i autor mówi o wprowadzeniu "HDR = YES; IMEX = 1" do ciągu zapytania, ale to w ogóle nie działa.

Czy ktokolwiek z was napotkał to?

Po prostu trochę więcej informacji. Nie może tego zrobić z silnika odrzutowego (Microsoft.Jet.OLEDB.4.0) tak to właśnie wygląda moje zapytanie:

SELECT * 
FROM 
    OPENROWSET('MSDASQL' 
       , 'Driver=Microsoft Excel Driver (*.xls);HDR=YES;IMEX=1;DBQ=C:\ImportFile.xls;' 
      , 'SELECT * FROM [Sheet1$]') 
+2

Teraz już wiesz, dlaczego ludzie ETL nienawidzą Excela za import! – HLGEM

Odpowiedz

6

Zauważam, że używasz sterownika Excel ODBC. Czy próbowałeś dostawcy JET OLEDB z równoważnym ciągiem połączenia?

select * from openrowset(
    'Microsoft.Jet.OLEDB.4.0', 
    'Data Source=C:\ImportFile.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"', 
    'SELECT * FROM [Sheet1$]') 

EDIT: Niestety, właśnie zauważyłem ostatni akapit. Z pewnością sterownik ODBC programu Excel wciąż jest przesyłany za pośrednictwem silnika JET, więc jaka to różnica?

EDYCJA: Sprawdziłem łącze KB194124, a wartości rejestru, które zaleca, są wartościami domyślnymi na moim komputerze, których nigdy nie zmieniłem. Użyłem powyższej metody kilka razy sam bez problemów. Może to problem środowiskowy?

+0

nie ma problemu, sprawdź http://stackoverflow.com/questions/1178243/what-is-the-difference-between-odbc-and-oledb, aby uzyskać więcej informacji – StevenMcD

+0

dzięki! Bardzo to doceniam! – StevenMcD

+0

+1. Rok po tym został opublikowany i rozwiązał ten sam problem dla mnie. – 8kb

1

Mamy natknąć się w tej samej sprawie. Niestety nie znaleźliśmy rozwiązania. Więcej informacji znajduje się pod numerem here, co oznacza, że ​​może wystąpić poprawka rejestru.

+0

fajne, dzięki za link – StevenMcD

2

Jeśli nie przeszkadza otwarcie pliku w programie Excel, wziąć kolumny, które mają ten problem, wybierz kolumnę, a nie

danych -> Tekst jako kolumny -> Dalej -> Dalej -> Text

Zapisz arkusz i wszystkie one powinny przyjść jako tekst w OPENROWSET

Znalazłem za pomocą plików CSV zamiast Excel otwierane poprzez utworzenie połączonego serwera i konfigurowania formatu plików w schema.ini bardziej praktyczne podejście do obsługi importu takiego jak ta, dzięki tej metodzie możesz to wyjaśnić wybierz format każdej kolumny.

0

Miałem ten sam problem. Naprawiłem wycinanie i wklejanie wiersza zawierającego kolumnę z wartością ciągu/wartości numerycznej (na przykład 123ABC) w pierwszym rzędzie arkusza. Z jakiegoś powodu T-SQL odczytuje pierwszy wiersz i zakłada, że ​​wszystkie wartości są numeryczne.

0

reakcja SqlACID w ten link działał świetnie [https://wikigurus.com/Article/Show/185717/OpenRowSet-command-in-TSQL-is-returning-NULLS]: -

Jeśli nie przeszkadza otwarcie pliku w programie Excel, wziąć kolumny, które mają ten problem, wybierz kolumnę, a nie

dane -> Tekst jako kolumny -> Dalej -> Dalej -> Tekst

Zapisz arkusz i wszystkie one powinny przyjść jako tekst w OPENROWSET

Znalazłem za pomocą plików CSV zamiast Excela, otwiera konfigurowanie połączonego serwera, i ustawienie formatu plików w schema.ini bardziej praktycznego podejścia do obsługi importu takiego jak ta, przy użyciu tej metody można jawnie wybrać format każdej kolumny.