SQL Server 6.5 взаимоблокировки с испанскими буквами ú и ü - PullRequest
1 голос
/ 18 апреля 2011

Мы запускаем SQL 6.5 через ADO, и у нас самая странная проблема.

Это предложение начнет генерировать тупики

insert clinical_notes ( NOTE_ID, CLIENT, MBR_ID, EPISODE, NOTE_DATE_TIME,  
NOTE_TEXT, DEI, CARE_MGR, RELATED_EVT_ID, SERIES, EAP_CASE, TRIAGE, CATEGORY,  
APPOINTMENT, PROVIDER_ID, PROVIDER_NAME )  
VALUES ( 'NTPR3178042', 'HUMANA/PR', '999999999_001', 'EPPR915347',  
'03-28-2011 11:25', 'We use á, é, í, ó, ú and ü (this is the least one we   
use, but there''s a few words with it, like the city: Mayagüez).', 'APK', 'APK', 
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )

Триггером являются символы ú и ü. Если они находятся в столбце NOTE_TEXT. NOTE_TEXT - текстовый столбец. Есть индексы на

UNC_not_id
NT_CT_MBR_NDX
NT_REL_EVT_NDX
NT_SERIES_NDX
idx_clinical_notes_date_time
nt_ep_idx

NOTE_ID - это первичный ключ.

Что произойдет после того, как мы выпустим это утверждение, если мы выдадим идентичное, но с новым значением NOTE_ID, мы получим тупик.

Как уже упоминалось, это происходит только тогда, когда ú или ü находится в NOTE_TEXT.

Это тестовый сервер, и, как правило, только одна сессия обращается к этой таблице при возникновении ошибки.

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

1 Ответ

0 голосов
/ 22 мая 2011
  1. Является ли столбец (var) char-based или n (var) char-based? Используются ли значения Unicode выше 255 или как 255 или ниже (250 и 252)?

  2. Попробуйте изменить столбец на двоичное сопоставление, просто чтобы посмотреть, поможет ли это (это может пролить свет на проблему). Я НЕ знаю, работает ли это в SQL 2000 (хотя я могу проверить в понедельник), но вы можете попробовать это, чтобы найти, какие параметры сортировки доступны на вашем сервере:

    SELECT * FROM ::fn_helpcollations()
    

    Латинский General BIN должен быть где-то там.

    Предполагая, что вы нашли сопоставление, которое нужно попробовать, вы измените сопоставление следующим образом:

    ALTER TABLE TableName ALTER COLUMN ColumnName varchar(8000) NOT NULL COLLATE Collation_Name_Here
    

    Сценарий вашей таблицы, чтобы узнать, какая сортировка используется сейчас, так что вы можете установить ее обратно, если она не работает или вызывает проблемы Или используйте резервную копию. :)

Еще одно замечание: если вы используете юникод, вам нужно N перед литеральными строками, например:

SELECT N'String'
...