Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Проблемы с collation


Автор: Lunatikus 8.11.2007, 16:16
При переносе клиента с тестового компьютера вне сети в реальную сеть и на релаьный сервер, при создании ##таблицы и попытке записать туда данные выдается ошибка невозможности приведения типов collation. Как пр исоздании таблицы явно указать collation?
Код

CREATE TABLE ##t1(pole1 varchar(30) NOT NULL,pole2 varchar(100) NULL,pole3 float NULL)

пожалуйста,помогите,я в ступоре  smile  в инф. базе просто написано, для чего,а синтаксиса в различных случаях нет,только общий
http://technet.microsoft.com/ru-ru/library/ms184391.aspx

Автор: Servena 8.11.2007, 16:28
Попробуй это сделать при создании БД:
Код

CREATE DATABASE myDB
COLLATE Traditional_Spanish_CI_AS

Ссылка на все названия в МСДН:
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.SQL.v2005.en/ssmprog3/html/eee6bae6-0c15-4959-9cd8-c8fe7c440bf0.htm

Автор: Lunatikus 8.11.2007, 16:45
база создана и заполнена, у нее есть свой коллэйт,вот под него мне надо подстроить свою временную таблицу.

Автор: Servena 8.11.2007, 16:54
А если попробовать создать БД с твоей таблицей с такой же Коллейт что и в той БД куда ты будешь переносить? А потом уже перенести.
Или изменить коллейт у себя
Код

CREATE DATABASE myDB
COLLATE Traditional_Spanish_CI_AS

а потом перенести таблицу?

Автор: Lunatikus 8.11.2007, 17:02
у меня ошибка вылетате только при создании временной глобальной таблицы, в которую я переношу данные выборкой из базы base1 у нее есть известный коллейт(при простых выборках и инсертах в базу никаких проблем).При создании временной таблицы я указываю текстовым полям COLLATE database_default. И все равно пр ипопытке инсерта выборки данных из этой же базы base1 происходит конфликт по collate...
=((((

Автор: SergKO 8.11.2007, 20:09
tempdb, в которой создается временная таблица имеет другую схему сопоставления, чем Ваша БД. А tempdb имеет схему сопоставления сервера. Выход единственный - переустановка SQL сервера с указанием требуемой схемы сопоставления. Вроде, есть утилита, которая изменяет collation, но, по сути, она неявно переустанавливает сервер.

Хотя, есть вариант, явно указывать collation при вставке, но, по-моему, это не стоит делать.

Автор: Lunatikus 9.11.2007, 09:15
я решил проверить, что будет если я не буду делать временную таблицу ,А просто сделаю запрос на выборку того,что надо вставлять в нее. В ней несколько left join'ов. Результат-та же ошибка конфликта collation...т.е. проблема не в ##таблице. Или при конструкции ADOQuery.open все равно создается временная таблица? К тому же парадокс в том,что в этом запросе используются все таблицы одной базы и у меня еще полно запросов, которые спокойно выполняются с таблицами из этой же базы.
Вот,на всякий случай приведу конфликтный запрос(на тестовом отдельном компе-сервере он выполнялся без проблем):
Код

DF.ADOQ14_1.SQL.Append(' SELECT d.status ,d.univer ,u.cod_artic as art,');
DF.ADOQ14_1.SQL.Append('        ''plann1''=CASE WHEN (d.zayavka/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)- '); //на полях plann1 и plann не стоит заострять внимание
DF.ADOQ14_1.SQL.Append('                   ROUND(d.zayavka/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END),0,1))>=0.8 ');
DF.ADOQ14_1.SQL.Append('                   THEN (ROUND(d.zayavka/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END),0,1)+1)*');
DF.ADOQ14_1.SQL.Append('                   (CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END) WHEN  (d.zayavka/(CASE WHEN ');
DF.ADOQ14_1.SQL.Append('                   a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)-ROUND(d.zayavka/(CASE WHEN a.EDN_V_UPAK>0 ');
DF.ADOQ14_1.SQL.Append('                   THEN a.EDN_V_UPAK ELSE 1 END),0,1))<=0.2 THEN ROUND(d.zayavka/(CASE WHEN a.EDN_V_UPAK>0 ');
DF.ADOQ14_1.SQL.Append('                   THEN a.EDN_V_UPAK ELSE 1 END),0,1)*(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END) ');
DF.ADOQ14_1.SQL.Append('                   WHEN  ((d.zayavka/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)-ROUND(d.zayavka/');
DF.ADOQ14_1.SQL.Append('                   (CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END),0,1))<0.8 AND (d.zayavka/(CASE WHEN ');
DF.ADOQ14_1.SQL.Append('                   a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)-ROUND(d.zayavka/(CASE WHEN a.EDN_V_UPAK>0 THEN ');
DF.ADOQ14_1.SQL.Append('                   a.EDN_V_UPAK ELSE 1 END),0,1))>0.2) THEN CASE WHEN (d.zayavka/(CASE WHEN u.kratn>0 ');
DF.ADOQ14_1.SQL.Append('                   THEN u.kratn ELSE 1 END)-ROUND(d.zayavka/(CASE WHEN u.kratn>0 THEN u.kratn ');
DF.ADOQ14_1.SQL.Append('                   ELSE 1 END),0,1))>=0.5 THEN (ROUND(d.zayavka/(CASE WHEN u.kratn>0 THEN u.kratn ');
DF.ADOQ14_1.SQL.Append('                   ELSE 1 END),0,1)+1)*(CASE WHEN u.kratn>0 THEN u.kratn ELSE 1 END) ELSE ');
DF.ADOQ14_1.SQL.Append('                   ROUND(d.zayavka/(CASE WHEN u.kratn>0 THEN u.kratn ELSE 1 END),0,1)*(CASE WHEN ');
DF.ADOQ14_1.SQL.Append('                   u.kratn>0 THEN u.kratn ELSE 1 END) END END, ');
DF.ADOQ14_1.SQL.Append('        ''plann''=CASE WHEN ((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)- ');
DF.ADOQ14_1.SQL.Append('                   ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END),0,1))>=0.8 ');
DF.ADOQ14_1.SQL.Append('                   THEN (ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END),0,1)+1)*');
DF.ADOQ14_1.SQL.Append('                   (CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END) WHEN  ((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN ');
DF.ADOQ14_1.SQL.Append('                   a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)-ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN a.EDN_V_UPAK>0 ');
DF.ADOQ14_1.SQL.Append('                   THEN a.EDN_V_UPAK ELSE 1 END),0,1))<=0.2 THEN ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN a.EDN_V_UPAK>0 ');
DF.ADOQ14_1.SQL.Append('                   THEN a.EDN_V_UPAK ELSE 1 END),0,1)*(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END) ');
DF.ADOQ14_1.SQL.Append('                   WHEN  (((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)-ROUND((d.zayavka/u.[коэффициент пересчета])/');
DF.ADOQ14_1.SQL.Append('                   (CASE WHEN a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END),0,1))<0.8 AND ((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN ');
DF.ADOQ14_1.SQL.Append('                   a.EDN_V_UPAK>0 THEN a.EDN_V_UPAK ELSE 1 END)-ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN a.EDN_V_UPAK>0 THEN ');
DF.ADOQ14_1.SQL.Append('                   a.EDN_V_UPAK ELSE 1 END),0,1))>0.2) THEN CASE WHEN ((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN u.kratn>0 ');
DF.ADOQ14_1.SQL.Append('                   THEN u.kratn ELSE 1 END)-ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN u.kratn>0 THEN u.kratn ');
DF.ADOQ14_1.SQL.Append('                   ELSE 1 END),0,1))>=0.5 THEN (ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN u.kratn>0 THEN u.kratn ');
DF.ADOQ14_1.SQL.Append('                   ELSE 1 END),0,1)+1)*(CASE WHEN u.kratn>0 THEN u.kratn ELSE 1 END) ELSE ');
DF.ADOQ14_1.SQL.Append('                   ROUND((d.zayavka/u.[коэффициент пересчета])/(CASE WHEN u.kratn>0 THEN u.kratn ELSE 1 END),0,1)*(CASE WHEN ');
DF.ADOQ14_1.SQL.Append('                   u.kratn>0 THEN u.kratn ELSE 1 END) END END, ');
DF.ADOQ14_1.SQL.Append('        a.rez_kolch as ost,a.kon_kolch as ost2,a.TIP_TOVR as nal,a.ID_SCLAD as sclad,e.[в каталоге] as stand,s.hand,s.com ,m.kolc_predm '+'as schet,u.kratn as kr,a.EDN_V_UPAK as fas ');

DF.ADOQ14_1.SQL.Append(' FROM (SELECT d1.status ,d1.univer ,d1.zayavka ');
DF.ADOQ14_1.SQL.Append('       FROM  '+deal[NomSelectFilial]+' d1 ');
DF.ADOQ14_1.SQL.Append('       WHERE d1.data=:data1 AND d1.zayavka>0 AND d1.univer<=''153000-AO'') d ');
DF.ADOQ14_1.SQL.Append(' LEFT JOIN (SELECT u1.Универартикул ,count(u1.Универартикул) cont,max(u1.COD_ARTIC) as COD_ARTIC,max(u1.[Коэффициент пересчета]) as [Коэффициент пересчета],'+'max(u1.[кратность]) as kratn ');  //по ходу именно с первым слиянием возникает ошибка: елси просто делать выборку без слияний, все без ошибок
DF.ADOQ14_1.SQL.Append('            FROM '+univer+' u1 WHERE u1.[Пред-во]=''МДМ(Москва)'' ');
DF.ADOQ14_1.SQL.Append('            GROUP BY u1.Универартикул) u  ON d.univer=u.Универартикул AND u.cont=1 ');
DF.ADOQ14_1.SQL.Append(' LEFT JOIN '+sp_artc_H002+' a ON a.COD_ARTIC=u.COD_ARTIC AND a.ID_SCLAD IN (2,31,35,37) AND a.TIP_TOVR<>''НЕТ'' ');
DF.ADOQ14_1.SQL.Append(' LEFT JOIN '+edin_spisok+' e ON e.Артикул=u.COD_ARTIC ');
DF.ADOQ14_1.SQL.Append(' LEFT JOIN '+schet[NomSelectFilial]+' s ON s.art=u.cod_artic AND s.auto=:data2 AND NOT u.cod_artic is NULL');
DF.ADOQ14_1.SQL.Append(' LEFT JOIN '+scl_move_H002+' m ON m.NAME_PREDM=u.cod_artic AND (TYPDOCM_PR=''C'' OR TYPDOCM_PR=''С'') AND VID_DOC=''ФИЛИАЛ'' ');
DF.ADOQ14_1.SQL.Append('                                  AND NUMDOCM_PR IN ('+nom_schet_string+') ');
DF.ADOQ14_1.Parameters.ParamByName('data1').Value:=strtodate(formatdatetime('dd.mm.yyyy',strtodate(SG.Cells[0,SG.row])-srok_podachi[NomSelectFilial]));
DF.ADOQ14_1.Parameters.ParamByName('data2').Value:=strtodate(SG.Cells[0,SG.row]);
DF.ADOQ14_1.open;

Автор: Servena 9.11.2007, 09:28
Как это можно воспроизвести?
А если все разбить на части:
т.е. оставить СЕЛЕКТ * и джоины? Нужно как то локализовать ошибку, ато так и не понятно при какой операции она возникает?
Или без языка программирования в СКЛ менеджере?


Автор: Lunatikus 9.11.2007, 09:28
SergKO, у меня сервер и все базы на нем,судя по параметрам, имеют один тип collation

Добавлено через 2 минуты и 7 секунд
Servena, да ,ты прав, локализовать надо. Без джойнов ошибки нет. Она появляется при первом слиянии. Но мне это ни о чем не говорит =( синтаксически то все верно.

Автор: Lunatikus 9.11.2007, 09:56
прошу прощенья,ошибся. Ошибка возникает при слияние с sp_artc_H002

Автор: Servena 9.11.2007, 10:09
А к твоему серверу можно через СКЛ менеджер подключиться с вне?

Автор: Lunatikus 9.11.2007, 10:17
у меня нет сервера,у меня есть только доступ к нему через учетку + я не могу поставить у себя на компе менеджер =( могу только через свою учетку с помощью проги. 
Блин,я вообще даже не представляю,в каком место МОЖЕТ БЫТЬ проблема с коллэйтом =( может, это изза того что все слияния , начиная со второго идут через сравнение данных не основного набора и сливаемого а первого подливаемого(univer) и нового подливаемого?

Автор: Servena 9.11.2007, 10:18
А вообще, ты пробовал выполнить этот запрос с СКЛ менеджера?

Автор: Lunatikus 9.11.2007, 10:19
проверил,нет,не изза этого

Добавлено через 33 секунды
Servena, да,все запросы на тестовом компе проверял в менеджере.

Автор: boevik 9.11.2007, 10:20
У каких то из этих полей 
Код

a.COD_ARTIC=u.COD_ARTIC AND a.ID_SCLAD IN (2,31,35,37) AND a.TIP_TOVR<>''НЕТ''

collate не совпадате. 
Скорее всего у слова ''НЕТ''.

Можно использовать следующий синтакс:
Код

a.COD_ARTIC=u.COD_ARTIC AND a.ID_SCLAD IN (2,31,35,37) AND a.TIP_TOVR collate database_default<>''НЕТ'' collate database_default

Автор: Servena 9.11.2007, 10:21
Нет, через СКЛ менеджер удаленно в реальной сети?

Автор: Lunatikus 9.11.2007, 10:30
boevik, может быть, сейчас проверю.
Кстати, проверил все джойны,ошибка возникает кроме sp_artc_H002 еще при слиянии с scl_move_H002.

Добавлено через 33 секунды
Servena, нет,у меня нет такой возможности  и не будет =/ админ не позволяет.

Добавлено через 4 минуты и 25 секунд
boevik, увы, такой запрос тоже выдает ошибку конфликта =(

Добавлено через 6 минут и 53 секунды
во, а если
Код

a.COD_ARTIC collate database_default=u.COD_ARTIC collate database_default AND a.ID_SCLAD IN (2,31,35,37) AND a.TIP_TOVR collate database_default<>''НЕТ'' collate database_default

работает!нука...сейчас проверю остальное...

Автор: boevik 9.11.2007, 11:12
Ошибка collate может вылететь на любом сравнивании стринговых полей.
Поэтому надо или быть уверенным в том что все поля одного коллейта или явно приводить к общему collate в запросе.

Автор: Lunatikus 9.11.2007, 11:51
все,теперь разобрался  и везде при сравнении ставил явное задание дефолтов.Спасибо большое, выручили!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)