Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
А вот - самое интересное, на мой взгляд. В продолжение предыдущей картинки - там же, но в 10-ой строке стоит 26. И - что характерно - в SQL она передается именно как 26! А не NULL как в первом случае с 51.

Так все-таки - визард DTS следует просто отбросить для задач импорта из Экселя? По причине непредсказуемости результата?

К сообщению приложен файл. Размер - 0Kb
11 мар 05, 16:41    [1379428]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Glory
Member

Откуда:
Сообщений: 104760
2Slav
1. Мне все таки интересует почему Excel-ий диалог с именем "Формат ячейки" воспринмается как "Тип данных ячейки" ?

2. Метод BugsBunny не подходит ?
11 мар 05, 16:55    [1379522]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
Glory
2Slav
1. Мне все таки интересует почему Excel-ий диалог с именем "Формат ячейки" воспринмается как "Тип данных ячейки" ?


Glory,

поверьте - я знаю разницу между форматом ячейки и типом данных, которые в ней лежат. (Кстати уж - в качестве оффтопа - а не подскажете, где в Экселе посмотреть не формат ячейки, а тип данных?)
Я привел картинки именно в заявленную тему - загадки работы DTS при импорте из Экселя. При прочих равных условиях. Почему в первом случае 51 в 5-ой строке - это число (и соответственно NULL в SQL, потому что первые 4 строки это текст) - а во втором случае 08.03 это текст, хотя ведь тоже число? Ведущий ноль говорит, что это именно текст. Но ведь и 51 вводилось в ячейку, предварительно отформатированную как Текст. Почему же оно текстом не стало? (с точки зрения визарда DTS). А вот 26 - в третьем примере - почему-то стало. Ведь 26 передается правильно! Ну чем 26 лучше 51? ;-)

Glory
2. Метод BugsBunny не подходит ?

Может и подходит - пока не проверял. Потому что не могу так с ходу организовать в T-SQL цикл по 184 листам файла xls. Придется идти в Дельфи. Целый огород городить.

Вопрос должен получить ясный ответ: импорт с использованием визарда DTS из Экселя недостоверен и категорически не рекомендуется к использованию? Никакие настройки не делают его работоспособным?

Мне надо было срочно решить задачу. Я это сделать не смог. Пожалуй стоит написать нормальную утилиту - популярность у неё будет бешеная! :-)
11 мар 05, 17:28    [1379704]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Glory
Member

Откуда:
Сообщений: 104760
Я привел картинки именно в заявленную тему - загадки работы DTS при импорте из Экселя. При прочих равных условиях. Почему в первом случае 51 в 5-ой строке - это число (и соответственно NULL в SQL, потому что первые 4 строки это текст) - а во втором случае 08.03 это текст, хотя ведь тоже число? Ведущий ноль говорит, что это именно текст. Но ведь и 51 вводилось в ячейку, предварительно отформатированную как Текст. Почему же оно текстом не стало? (с точки зрения визарда DTS). А вот 26 - в третьем примере - почему-то стало. Ведь 26 передается правильно! Ну чем 26 лучше 51? ;-)
Много раз уже говорилось что MSSQL пытается определить тип столбца по нескольким первым его значениям. И после этого все последующие просто пытается читать как этот тип. Если не удается то ставит NULL.
Поэтому 26 ничем не лучше 51 или 08.03 - вопрос в том совпадает ли тип данных конкретной ячейки с выбранным на данный момент MSSQL-ем типом.
11 мар 05, 17:35    [1379740]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
Glory
Я привел картинки именно в заявленную тему - загадки работы DTS при импорте из Экселя. При прочих равных условиях. Почему в первом случае 51 в 5-ой строке - это число (и соответственно NULL в SQL, потому что первые 4 строки это текст) - а во втором случае 08.03 это текст, хотя ведь тоже число? Ведущий ноль говорит, что это именно текст. Но ведь и 51 вводилось в ячейку, предварительно отформатированную как Текст. Почему же оно текстом не стало? (с точки зрения визарда DTS). А вот 26 - в третьем примере - почему-то стало. Ведь 26 передается правильно! Ну чем 26 лучше 51? ;-)
Много раз уже говорилось что MSSQL пытается определить тип столбца по нескольким первым его значениям. И после этого все последующие просто пытается читать как этот тип. Если не удается то ставит NULL.
Поэтому 26 ничем не лучше 51 или 08.03 - вопрос в том совпадает ли тип данных конкретной ячейки с выбранным на данный момент MSSQL-ем типом.


Glory,

1. "...много раз уже говорилось". Да - по этой проблеме темы открываются с завидной регулярностью. Но ни в одной нет прямого ответа - как решить эту проблему? Не на уровне "танцев с бубном" - а средствами того же DTS. Более того - Ваши ответы стимулируют и впредь открытие подобных тем. ;-)

"...пытается определить тип столбца по нескольким первым его значениям. И после этого все последующие просто пытается читать как этот тип."
Хотелось бы точное описание алгоритма. По скольким значениям? Как происходит выбор в случае 3 и более разных типов в одном столбце? Да и Вы уверены - что по "первым"? Тогда попробуйте такой пример:

Excell         SQL

col1            название колонки
abc             NULL
25.05.2005      38436
123.00          123
Тип получившейся колонки - float. А ведь первое значение - текст.

Изменим немного исходный файл:
Excell         SQL

col1            название колонки
abc             abc
qwe             qwe
25.05.2005      NULL
123.00          NULL
Тип получившейся строки - nvarchar. Допустим. Но в чем проблема - дату и число представить в текстовом виде? Функции а-ля FloatToStr или DateToStr есть во всех языках.

В результате почти недельных мучений (и поисков в сети описания этого самого пресловутого "алгоритма") пришлось написать небольшую утилитку под свой конкретный случай. Рискну поставить точку в этой "вечнозеленой" теме: в MS SQL Server 2000 импорт из Excell элементарно не работает. Гарантировать правильную передачу даже однородных данных, имеющих один и тот же формат ячейки (как в моем случае - 51 и 8.06) нельзя. В случае разнородных данных проблема только усугубляется.

PS "...вопрос в том совпадает ли тип данных конкретной ячейки с выбранным на данный момент MSSQL-ем типом."
Вы упорно разделяете в Excell формат вывода и тип данных. И так же упорно не хотите подсказать - а где этот тип можно посмотреть и изменить? Из каких загадочных тайников MS SQL берет этот самый тип - на который я даже посмотреть не могу? (разве что внешнее представление изменить)
18 мар 05, 14:02    [1397711]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Glory
Member

Откуда:
Сообщений: 104760
1. "...много раз уже говорилось". Да - по этой проблеме темы открываются с завидной регулярностью. Но ни в одной нет прямого ответа - как решить эту проблему? Не на уровне "танцев с бубном" - а средствами того же DTS. Более того - Ваши ответы стимулируют и впредь открытие подобных тем. ;-)
Мои ответы стимулируют ???
Может нежелание других отказатся от Excel как способа импорта/экспорта ?

Хотелось бы точное описание алгоритма. По скольким значениям? Как происходит выбор в случае 3 и более разных типов в одном столбце? Да и Вы уверены - что по "первым"? Тогда попробуйте такой пример:

Приведу еще раз данную выше ссылку от BugsBunny - там все сказано
http://support.microsoft.com/kb/194124/EN-US/


В результате почти недельных мучений (и поисков в сети описания этого самого пресловутого "алгоритма") пришлось написать небольшую утилитку под свой конкретный случай.
По-моему опять же в ссылке приведено решение.
Не говоря о том, что простейшим рещением было бы просто сохранить Excel как текстовый файл с разделителем. И импортировать уж его

Рискну поставить точку в этой "вечнозеленой" теме: в MS SQL Server 2000 импорт из Excell элементарно не работает. Гарантировать правильную передачу даже однородных данных, имеющих один и тот же формат ячейки (как в моем случае - 51 и 8.06) нельзя. В случае разнородных данных проблема только усугубляется.
Работа происходит не напрямую, а через Jet. Таке что _любое ПО_, которое как и MSSQL будет работать через этот драйвер получит теже самые проблемы

Вы упорно разделяете в Excell формат вывода и тип данных. И так же упорно не хотите подсказать - а где этот тип можно посмотреть и изменить? Из каких загадочных тайников MS SQL берет этот самый тип - на который я даже посмотреть не могу? (разве что внешнее представление изменить)
А вас не посещяла мысль что моя скрытность вызывана незнанием ответа на ваш вопрос ?
18 мар 05, 17:53    [1398823]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
AVVS
Member

Откуда:
Сообщений: 335
Slav

Glory,

1. "...много раз уже говорилось". Да - по этой проблеме темы открываются с завидной регулярностью. Но ни в одной нет прямого ответа - как решить эту проблему? Не на уровне "танцев с бубном" - а средствами того же DTS. Более того - Ваши ответы стимулируют и впредь открытие подобных тем. ;-)

"...пытается определить тип столбца по нескольким первым его значениям. И после этого все последующие просто пытается читать как этот тип."
Хотелось бы точное описание алгоритма. По скольким значениям? Как происходит выбор в случае 3 и более разных типов в одном столбце? Да и Вы уверены - что по "первым"? Тогда попробуйте такой пример:



Может быть еще разочек попробуем:

1. DTS'у можно явно указать какой тип данных содержится в каждом импортируемом столбце. Если там, к примеру, замес из текста (varchar) и цифирек (int, float, decimal, money etc.), то вы можете ему сказать:

- импортировать как текст (varchar), будут импортированы ВСЕ значения
- импортировать как данные некоторого типа, тогда данные, которые укалдываются в этот тип будут к нему преобразованы, а все остальные
данные, которые не укладываются, будут приведены к NULL.

На вкладке DTS есть кнопочка [Trasform] - ткнитесь в нее и для каждого стоблца выберите то, что нужно.

2. Где-то читал, но не могу утверждать точно, что DTS пытается определить тип данных столбца по первым 25 строкам (значениям). Если он находит смешение типов данных, то пытается выбрать такой, который позволит импортировать максимально число значений.
т.е. если видит
int + float = выберет float (причем money или numeric не выберет никогда)

int+ text = выберет varchar(255) или nvarchar(255)

ну и т.д. В крайнем случае - всегда выберет varchar, к нему все что угодно привести можно, только тогда парсить импортированные значения придется уже самому.
19 мар 05, 12:33    [1399571]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Glory
Member

Откуда:
Сообщений: 104760
1. DTS'у можно явно указать какой тип данных содержится в каждом импортируемом столбце. Если там, к примеру, замес из текста (varchar) и цифирек (int, float, decimal, money etc.), то вы можете ему сказать:
Может там можно указать все таки тип данных в _приемнике_? А не в источнике как вы утверждаете. А за тип данных _источника_ отвечает драйвер источника.

2. Где-то читал, но не могу утверждать точно, что DTS пытается определить тип данных столбца по первым 25 строкам (значениям). Если он находит смешение типов данных, то пытается выбрать такой, который позволит импортировать максимально число значений.
Цитирую ссылку

"NOTE: Setting IMEX=1 tells the driver to use Import mode. In this state, the registry setting ImportMixedTypes=Text will be noticed. This forces mixed data to be converted to text. For this to work reliably, you may also have to modify the registry setting, TypeGuessRows=8. The ISAM driver by default looks at the first eight rows and from that sampling determines the datatype. If this eight row sampling is all numeric, then setting IMEX=1 will not convert the default datatype to Text; it will remain numeric. "
19 мар 05, 13:11    [1399604]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
AVVS

Может быть еще разочек попробуем:

1. DTS'у можно явно указать какой тип данных содержится в каждом импортируемом столбце. Если там, к примеру, замес из текста (varchar) и цифирек (int, float, decimal, money etc.), то вы можете ему сказать:

- импортировать как текст (varchar), будут импортированы ВСЕ значения
- импортировать как данные некоторого типа, тогда данные, которые укалдываются в этот тип будут к нему преобразованы, а все остальные
данные, которые не укладываются, будут приведены к NULL.

На вкладке DTS есть кнопочка [Trasform] - ткнитесь в нее и для каждого стоблца выберите то, что нужно.


AVVS,

тыкался неоднократно. А Вы сами-то пробовали? Рекомендую - говорят, смех продлевает жизнь. ;-)
К началу импорта столбец определяется как float. Я его меняю на nvarchar 50. И действительно - в результирующей таблице столбец имеет текстовый тип! Только - судя по всему - все преобразования (о которых никто не просил) уже произведены:

Excel           MS SQL 
col1            название столбца (тип - nvarchar 50)
01.01.2005      38353
02.01.2005      38354
abc              NULL
qwe             NULL
589.00          589
367.00          367

Так что там совсем не "...какой тип данных содержится в каждом импортируемом столбце." А какой тип вы хотели бы видеть - но проводить или не проводить преобразования (и как их проводить) вас никто не спрашивает.


AVVS

2. Где-то читал, но не могу утверждать точно, что DTS пытается определить тип данных столбца по первым 25 строкам (значениям). Если он находит смешение типов данных, то пытается выбрать такой, который позволит импортировать максимально число значений.
т.е. если видит
int + float = выберет float (причем money или numeric не выберет никогда)

int+ text = выберет varchar(255) или nvarchar(255)

ну и т.д. В крайнем случае - всегда выберет varchar, к нему все что угодно привести можно, только тогда парсить импортированные значения придется уже самому.

Посмотрите еще раз пример, который я привел в этом посте. "В крайнем случае" был выбран float - самый, на мой взгляд, неудачный (и что интересно - стоящий даже не в начале, а в конце) формат для этого набора данных. Вот я и недоумеваю - почему?
21 мар 05, 17:37    [1403076]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
Glory

...
Может нежелание других отказатся от Excel как способа импорта/экспорта ?
...
Не говоря о том, что простейшим рещением было бы просто сохранить Excel как текстовый файл с разделителем. И импортировать уж его.


Glory,

предлагаю все-таки не смешивать саму проблему и пути её решения. Импорт из Excel не работает. Хорошо - работает, мягко говоря, странно. Проблема налицо. Обойти её, можно, например, через текстовый файл. Правда запоминать таким образом можно только по листам - а, если Вы помните, в моем случае их без малого 200 штук. Как раз на день работы. Не говоря уже о том, что через неделю мне придется опять делать тоже самое... Можно еще копи-паст приспособить - но сама проблема-то останется.

Glory

Приведу еще раз данную выше ссылку от BugsBunny - там все сказано
http://support.microsoft.com/kb/194124/EN-US/
...
По-моему опять же в ссылке приведено решение.
...

Да - действительно IMEX=1 частично решает проблему. Но возникает другая - при наличии "фирменного" DTS приходится писать свою собственную утилиту. Со всеми вытекающими...
Но эта опция тесно увязана - не очень прозрачным способом - с TypeGuessRows. На разных машинах может быть совершенно разный результат. Или на одной машине - при разных конкретных наборах. И логика эта для меня по прежнему загадка.
21 мар 05, 18:01    [1403168]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Glory
Member

Откуда:
Сообщений: 104760
Импорт из Excel не работает. Хорошо - работает, мягко говоря, странно. Проблема налицо.
Это проблема ваша. Excel - это не то ПО, которое нужно использовать в качестве интерфейса. Потому что заставляет вас решать задачу по контролю вводимой информации не ДО а ПОСЛЕ ее ввода.

Но возникает другая - при наличии "фирменного" DTS приходится писать свою собственную утилиту. Со всеми вытекающими...
DTS как MSSQL НЕ работает с Excel файлами напрямую. Он использует Jet.OLEDB. Поэтому проблема ваша к DTS-у притянута за уши. Ибо DTS ничего сверх возможностей самого драйвера вам предложить не сможет

Правда запоминать таким образом можно только по листам - а, если Вы помните, в моем случае их без малого 200 штук. Как раз на день работы.
Вы имете ввиду записывать каждый лист в файл ВРУЧНУЮ ??? Однако.

Да - действительно IMEX=1 частично решает проблему. Но возникает другая - при наличии "фирменного" DTS приходится писать свою собственную утилиту. Со всеми вытекающими...
Если IMEX=1 решает проблему то какую еще утилиту нужно писать ?
21 мар 05, 18:18    [1403229]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
27 понуро бредущих кроликов
Member

Откуда:
Сообщений: 262
Slav
Импорт из Excel не работает. Хорошо - работает, мягко говоря, странно.


Странно...Я из EXCEL-я через DTS в ORACLE сливаю - и все нормально работает,в оракловаых таблицах все поля varchar2, в DTS Transformation - CopyColumn.

Перед этим еще Active-X Script-ом Names-ы в хls прописываю, из низ данные брать удобнее, чем прямо из Sheet-a, если в workBook несколько разных таблиц на страницу положено...
21 мар 05, 19:20    [1403398]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
AVVS
Member

Откуда:
Сообщений: 335
Slav

Посмотрите еще раз пример, который я привел в этом посте. "В крайнем случае" был выбран float - самый, на мой взгляд, неудачный (и что интересно - стоящий даже не в начале, а в конце) формат для этого набора данных. Вот я и недоумеваю - почему?


Мдя :( Натурный эксперимент с приведенными данными дал отрицательный результат. Попробую еще. Если получится, постараюсь сообщить.

Конкретно в этом случае - если DTS указать varchar, то получается сообщение об ошибке, DTS не может преобразовать данные типа Date в текст!
О, как! :(
22 мар 05, 00:22    [1403857]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
27 понуро бредущих кроликов
Member

Откуда:
Сообщений: 262
AVVS
Конкретно в этом случае - если DTS указать varchar, то получается сообщение об ошибке, DTS не может преобразовать данные типа Date в текст!
О, как! :(


А ксли поставить Transformation DateTime String?
22 мар 05, 10:15    [1404348]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
AVVS
Member

Откуда:
Сообщений: 335
27 понуро бредущих кроликов
AVVS
Конкретно в этом случае - если DTS указать varchar, то получается сообщение об ошибке, DTS не может преобразовать данные типа Date в текст!
О, как! :(


А ксли поставить Transformation DateTime String?


Ща попробую. Но у меня вообще полная лажа полезла, когда я стал именно эти данные пробовать.

Для целевого столобца ставлю varchar(255) (в DTS).

В ехеле форматирую столбец как text.
При этом данные в виде даты съезжают в числовые значения (есть такая бага у ехеля).
Числа остаются числами, но съезжают к левому краю поля (т.е. становятся
текстовыми в понимании ехеля).

Хрен, с тобой золотая рыбка: перебиваю даты в виде текста, числовые оставляю как есть. При этом забиваю еще одно значение в виде (и формате) даты (чтбы эксперимент был чистым)

Импортирую.

Имеем -
Строки с буковками - OK
Строки с датой в виде текста - OK
Строка с датой в виде даты :) - NULL
Строки с цифирьками в виде текста - NULL

В общем, вышел мне от этого DTS'a "жестокий афронт" :)
22 мар 05, 10:38    [1404442]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
Glory

Это проблема ваша. Excel - это не то ПО, которое нужно использовать в качестве интерфейса. Потому что заставляет вас решать задачу по контролю вводимой информации не ДО а ПОСЛЕ ее ввода.


Glory,

в данном конкретном случае Ваш пафос немного не по адресу. Предполагается заключение большого контракта, потенциальный партнер принес мне данные в Excel - чтобы подложить под мою систему в MS SQL. Я сам таких файлов с таким количеством листов до сих пор не видел. Вы предлагаете мне прочитать им лекцию об интерфейсах и со словами "Это ваша проблема" послать куда подальше? Боюсь тогда мне придется разбираться с DTS в другом месте. ;-)

Glory

DTS как MSSQL НЕ работает с Excel файлами напрямую. Он использует Jet.OLEDB. Поэтому проблема ваша к DTS-у притянута за уши. Ибо DTS ничего сверх возможностей самого драйвера вам предложить не сможет

С уточнением согласен. Попробую учесть все тонкости формулировки проблемы: визард DTS (от Microsoft Corporation), используя Jet.OLEDB (от Microsoft Corporation) не позволяет произвести корректный импорт из Excel (от Microsoft Corporation) в MS SQL (от Microsoft Corporation). Конкретно к DTS претензий у меня нет. (великий А.Райкин вспомнился: "К пуговицам претензии есть? - Нет!")

Glory

Правда запоминать таким образом можно только по листам - а, если Вы помните, в моем случае их без малого 200 штук. Как раз на день работы.
Вы имете ввиду записывать каждый лист в файл ВРУЧНУЮ ??? Однако.

Вы будете удивлены - но я вообще не собираюсь записывать в текстовые файлы ничего!!! Я читаю непосредственно из xls файла - зачем мне еще какие-то???
1. Извините, но Вы обсуждаете несколько другую проблему. Мы говорим об импорте из файла Excel - а Вы (настойчиво) из текстового файла.
2. Вы будете еще раз удивлены - но написать в Excel макрос по Sheets.Count может не каждый. Кроме того, в этом же макросе необходимо предусмотреть формирование файла скрипта по загрузке этих самых текстовых файлов в MS SQL. Или Вы будете грузить эти 200 файлов ВРУЧНУЮ??? Только зачем же так корячиться?


Glory

Да - действительно IMEX=1 частично решает проблему. Но возникает другая - при наличии "фирменного" DTS приходится писать свою собственную утилиту. Со всеми вытекающими...
Если IMEX=1 решает проблему то какую еще утилиту нужно писать ?

Честно говоря, я не понял Вашего вопроса. Что значит "какую"? Да ту самую, где я этот IMEX поставлю в:
...OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\Test.xls";User ID=Admin;Password=;Extended properties="Excel 8.0;HDR=No;IMEX=1"')...Sheet1$

Зная Вашу педантичность уточню: "собственную утилиту (на VB or Delphi) или скрипт (на T-SQL)" Суть дела не меняет - обычную задачу по импорту данных нельзя поручить оператору. Изменить такой существенный параметр ( галочкой, например) в визарде DTS не представляется возможным - его там просто нет.

Все-таки хотелось бы, чтобы эта тема стала последней в проблеме импорта из Excel. Поэтому уточню, что я имел ввиду под:
Но эта опция тесно увязана - не очень прозрачным способом - с TypeGuessRows. На разных машинах может быть совершенно разный результат. Или на одной машине - при разных конкретных наборах. И логика эта для меня по прежнему загадка.
IMEX=1 действительно позволяет получить в корректном виде вседанные. Приятно радует, что работает он не дубово - если в столбце, допустим, число, дата, текст - то будет выбран результирующий текст. Если же, целое и флоат - то флоат. Смысл понятен - анализ содержимого столбца и выбор наиболее подходящего типа, чтобы передать все данные (не максимально возможное - а именно все). Но вот зачем вообще нужен TypeGuessRows? При том же значении 8 имеем:
1         1
2         2
3         3
abc      abc

1         1
2         2
....
8         8
9         9
abc      NULL

В первом случае - тип полученной колонки nvarchar, во втором - float. Какой смысл - задаться целью передать все данные, но анализировать только какую-то часть столбца? Почему нельзя - если уж стоит такая задача - проанализировать весь столбец, а потом выбрать тип для импорта? Быстродействие? Вряд ли - сам Excel не позволяет делать гигантские файлы. Да ведь и цель - импортировать все данные.
Вот и получается - в зависимости от того, какое значение TypeGuessRows в реестре на данной конкретной машине установлено (на клиенте - не на сервере), результаты будут разные. Кроме того, результат также зависит и от конкретных данных (см. пример выше). Поэтому - чтобы получить гарантированный результат - каждый раз надо узнать количество строчек в листе, изменить в реестре TypeGuessRows и затем открыть с IMEX=1.
22 мар 05, 13:20    [1405209]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
27 понуро бредущих кроликов
Slav
Импорт из Excel не работает. Хорошо - работает, мягко говоря, странно.


Странно...Я из EXCEL-я через DTS в ORACLE сливаю - и все нормально работает,в оракловаых таблицах все поля varchar2, в DTS Transformation - CopyColumn.

Перед этим еще Active-X Script-ом Names-ы в хls прописываю, из низ данные брать удобнее, чем прямо из Sheet-a, если в workBook несколько разных таблиц на страницу положено...


27 понуро бредущих кроликов,

наверно, MS любит ORACLE больше, чем себя. ;-)
22 мар 05, 13:23    [1405231]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
27 понуро бредущих кроликов
Member

Откуда:
Сообщений: 262
Slav
27 понуро бредущих кроликов
Slav
Импорт из Excel не работает. Хорошо - работает, мягко говоря, странно.


Странно...Я из EXCEL-я через DTS в ORACLE сливаю - и все нормально работает,в оракловаых таблицах все поля varchar2, в DTS Transformation - CopyColumn.

Перед этим еще Active-X Script-ом Names-ы в хls прописываю, из низ данные брать удобнее, чем прямо из Sheet-a, если в workBook несколько разных таблиц на страницу положено...


27 понуро бредущих кроликов,

наверно, MS любит ORACLE больше, чем себя. ;-)


Да просто так проще, чем OWB или HS настраивать.А MS SQL все равно у меня стоит..
24 мар 05, 11:06    [1411284]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Andrey_X
Member

Откуда: Kharkov
Сообщений: 5
Попробуйте заменить импорт на экспорт. Сам набил себе кучу шишек и с DTS и с OPENROWSET. Лучшим решением оказалось использование VB. Помимо типа столбца этот вариант обходит наличие хидеров и футеров, а также некоторые отклонения от нормализации при формировании таблиц Excel. Скорость максимальная. DTS рулит, но без наличия в Excel "изысков".
VB пользовал одноразово, только для этого случая. Так что по нему вопросы не ко мне и лучше в другой форум.

Public Sub ExportToSQL()
     
    Set cnnADODB = CreateObject("ADODB.Connection")
    Set cmdADODB = CreateObject("ADODB.Command")

    cnnADODB.ConnectionString = "Provider=SQLOLEDB.1;....." 
    cnnADODB.Open

    cmdADODB.ActiveConnection = cnnADODB
    cmdADODB.CommandType = 1
    cmdADODB.Prepared = True

    cmdADODB.CommandText = "INSERT INTO ['T1'] " & _
        "(F1, F2, F3, F4, F5) " & _
        " VALUES (?,?,?,?,?)"

    cmdADODB.Parameters.Append cmdADODB.CreateParameter("p1", 3, 1, 4)
    cmdADODB.Parameters.Append cmdADODB.CreateParameter("p2", 200, 1, 255)
    cmdADODB.Parameters.Append cmdADODB.CreateParameter("p3", 200, 1, 255)
    cmdADODB.Parameters.Append cmdADODB.CreateParameter("p4", 200, 1, 255)
    cmdADODB.Parameters.Append cmdADODB.CreateParameter("p5", 200, 1, 255)

    iRow = 5

    While ActiveSheet.Cells(iRow, 3).Value <> ""

        For iCol = 1 To 5
            par = "p" & iCol
            cmdADODB.Parameters(par).Value = ActiveSheet.Cells(iRow, iCol).Value 
        Next

        cmdADODB.Execute

        iRow = iRow + 1

    Wend

    cnnADODB.Close
    
    If Not cmdADODB Is Nothing Then Set cmdADODB = Nothing
    If Not cnnADODB Is Nothing Then Set cnnADODB = Nothing

End Sub
31 мар 05, 13:18    [1429879]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Pantalone
Member

Откуда:
Сообщений: 1321
Импорт из экселя в аксес дает ту же самую проблему. Весело живем..
14 апр 05, 12:16    [1467732]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Estets
Member

Откуда: Химки
Сообщений: 604
Когда столкнулся с такой-же проблемой, решил ее просто ;) написал маленький скриптик который прибавлял к значению поля пробел.
Потом загонял все данные как varchar через ODBC.

О IMEX=1 не знал, спасибо.
14 апр 05, 13:11    [1468092]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Tаrantino
Member

Откуда:
Сообщений: 3767
Мля звиздей просто какой-то, у меня получилось только через CSV
17 май 05, 11:37    [1546669]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Slav
Member

Откуда: МАсква, великий и прекрасный город
Сообщений: 9047
Tаrantino
Мля звиздей просто какой-то, у меня получилось только через CSV


Tаrantino,

во-во! Это так и работает - через... CSV. Повезет тому, у кого это один раз и недолго (в смысле - и файлов и листов в них немного). ;-)
17 май 05, 12:52    [1547114]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Tаrantino
Member

Откуда:
Сообщений: 3767
мне повезло, у меня один файл и один листик, а заметили только через два месяца как начали экспортировать их экселя...
17 май 05, 13:10    [1547229]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных из MS Excel  [new]
Pantalone
Member

Откуда:
Сообщений: 1321
Только что проверил, Аccess XP определяет каким будет столбец по первому значению в ячейке. По крайней мере поставив символ в поле оно залилось как текст, хотя без этого лилось как цифровое.
20 май 05, 10:13    [1557802]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить