Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Обращение к колонкам с пробелами в названии (число прочтений - 5614 )
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Обращение к колонкам с пробелами в названии
12. Декабря 2012 :: 13:02
Печать  
Вопрос вот в чем.
Я в запросе вынужден обращаться к колонкам таблицы, название которых имеет вид: "Лабуда / другая лабуда"
Так вот, ODBC матюкается при выполнении ВыполнитьСкалярный:
Цитата:
State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Лабуда/другаялабуда'

Конечно же, я наименование колонок в запросе указываю в квадратных скобках
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #1 - 12. Декабря 2012 :: 13:24
Печать  
приведи запрос полностью.
также попробуй название колонки заключить в квадратные скобки []
Ну и если есть возможность то имена столбцов лучше
задавать одним словом и английскими буквами.


PS какая версия  sql сервера?
  
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #2 - 12. Декабря 2012 :: 13:49
Печать  
Да я уже решил делать сначала переименование столбцов.
Такие названия столбцов получаются при импорте таблиц Excel.
Я их затем "нормализую" из 1С.
MS SQL 2000 SP3
А запрос уж очень большой получается.
Вот, как он формируется:
[code]      
     текст = "
     |select name
     |  from syscolumns
     | where id=object_id('" +Начало + "recalls')
     |";
     тз = СоздатьОбъект("ТаблицаЗначений");
     конн.ВыполнитьИнструкцию(текст, тз,1);
     Для инд = 1 По 12 Цикл
           тз.УдалитьСтроку(1);
     КонецЦикла;                        //    --  9  --
     стр = 0;
     Если (тз.НайтиЗначение("Итого",стр,1) = 1) Тогда
           тз.УдалитьСтроку(стр);
     КонецЕсли;

     текст = "
     |INSERT INTO [Import].[dbo].[_Visits]
     |SELECT
     |      CAST('01/' + CAST("+ Сред(Начало,6,2) +" as nchar(2)) + '/' + CAST("+ Сред(Начало,1,4) +" as nchar(4)) as smalldatetime) as Dt,
     |      recalls.F8 as Item,
     |";
     стр1 = "      CASE ";
     тз.ВыбратьСтроки();
     Пока тз.ПолучитьСтроку() = 1 Цикл
         стр1 = стр1 + "            WHEN recalls.["+тз.name + "] <> 0 THEN '"+тз.name+"'";
     КонецЦикла;
     стр1 = стр1 + "
     |            ELSE ''
     |      END";
     Сообщить("
     |            ELSE ''
     |      END");
     текст = текст + стр1 + " as DocType,
     |      recalls.Итого as Value
     |FROM      [Import].[dbo].["+ Начало + "recalls] as recalls
     //|INNER JOIN [Import].[dbo].[_Items] as items ON items.Morion = recalls.F8
     |WHERE      (SELECT TOP 1 Item
     |             FROM [Import].[dbo].[_Visits] as visits
     |             WHERE      visits.Dt = CAST('01/' + CAST("+ Сред(Начало,6,2) +" as nchar(2)) + '/' + CAST("+ Сред(Начало,1,4) +" as nchar(4)) as smalldatetime)
     |                        AND visits.Item = recalls.F8 AND visits.DocType = "+стр1+") IS NULL
     |";
     конн.ВыполнитьСкалярный(текст);
[/code]
Короче говоря, я попробую с переименованием колонок.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #3 - 12. Декабря 2012 :: 13:52
Печать  
Все работает. Только что попробовал.
Пример во вложении.
PS. Хотя проверял на SQL 2005.
  

______________________3.ert ( 66 KB | Загрузки )
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #4 - 12. Декабря 2012 :: 14:07
Печать  
у меня твой пример ругается вот так:
State 42S02, native 208, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'sys.objects'.

Для чистоты эксперимента правильно создавать колонку не как [КОЛОНКА С ПРОБЕЛАМИ], а как [КОЛОНКА / С / ПРОБЕЛАМИ]
т.е. со слешами

Ругательство убрал при помощи "Use DatabaseName" в начале каждого запроса.
Но запрос с результатом все  равно возвращает пустую таблицу.
Даже когда условие убираю совсем.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #5 - 12. Декабря 2012 :: 14:50
Печать  
Через переименование столбцов все получилось.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #6 - 13. Декабря 2012 :: 07:52
Печать  
Простно интересно, а вот такой код у тебя выполниться:
Код
Выбрать все
ODBCRecordSet = СоздатьОбъект("ODBCRecordSet");
ТекстЗапроса =
"SELECT
|	'КОЛОНКА С ПРОБЕЛАМИ' AS [КОЛОНКА С ПРОБЕЛАМИ]
|	,'КОЛОНКА / СО / СЛЕШАМИ' AS [КОЛОНКА / СО / СЛЕШАМИ]";
ИТ = СоздатьОбъект("ИндексированнаяТаблица");
ИТ = ODBCRecordSet.ВыполнитьИнструкцию(ТекстЗапроса,ИТ);
ИТ.ВыбратьСтроку();
 


Только именно "ИндексированнаяТаблица", не "ТаблицаЗначений".
  
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #7 - 13. Декабря 2012 :: 08:05
Печать  
Да, отработал без проблем!
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #8 - 13. Декабря 2012 :: 11:53
Печать  
Значит могут быть на SQL2000 колонки с пробелами.
  
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #9 - 13. Декабря 2012 :: 12:28
Печать  
Так это же не названия колонок в последнем примере.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #10 - 13. Декабря 2012 :: 14:26
Печать  
Как не названия?
[КОЛОНКА / СО / СЛЕШАМИ] - это название колонки.
  
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Обращение к колонкам с пробелами в названии
Ответ #11 - 14. Декабря 2012 :: 07:38
Печать  
Это колонка результата запроса, а я говорю о колонке таблицы БД.
Я предполагаю, что проблема была в том, что после передачи на выполнение текста запроса объекту ODBCRecordset, он его парсит и почему-то убирает пробелы в имени столбца, если он указан в квадратных скобках.
По крайней мере, такая трактовка сообщения об ошибке приходит на ум.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать