Страница 1 из 1

Вопрос по синтаксису запроса.

Добавлено: 2010-01-15 15:04:04
Amadeus
Доброго времени суток.

Есть такая ситуевина.

Код: Выделить всё

SELECT @plat=IsNull^(MAX^(N_PLAT_POR^),0^)+1 FROM SCL_NAKL ^(UPDLOCK HOLDLOCK^)^;
Это исходный кусок запроса, при котором, вновь созданному документу, присваивается самый большой номер. В данном случае счета.
Возникла необходимость поменять номерацию, уменьшить его, что бы номер брался +1 от конкретного типа записей.

Код: Выделить всё

SELECT @plat=IsNull^(MAX^(N_PLAT_POR^),0^)+1 FROM SCL_NAKL Where type_doc='С'  ^(UPDLOCK HOLDLOCK^)^ ;

SELECT @plat=IsNull^(MAX^(N_PLAT_POR^),0^)+1 FROM SCL_NAKL ^(UPDLOCK HOLDLOCK^)^  Where type_doc='С';

SELECT @plat=IsNull^(MAX^(N_PLAT_POR^),0^)+1 FROM SCL_NAKL  Where type_doc='С';
где

Код: Выделить всё

Where type_doc='С'
C - это большая русская С. и кусок указывает на тип.

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

Re: Вопрос по синтаксису запроса.

Добавлено: 2010-01-15 15:07:49
Гость
Ни один из вариантов не прокатил,
результат какой?

Re: Вопрос по синтаксису запроса.

Добавлено: 2010-01-15 15:11:43
Amadeus
В рабочем варианте, при выполнении данного запроса, в БД падает неучитываемый счет, т.е обычный текстовик с порядковым номером счета.

При попытках изменить запрос, в первом и третьем случае, счета в базе нет, во втором - вещается весь модуль выписки таких счетов.

Re: Вопрос по синтаксису запроса.

Добавлено: 2010-01-17 16:15:22
Fastman
Система глупая конечно.
Нежелательно делать выборки по каким то текстовым значениям и признакам.
Но чтобы не вдаваться в подробности ваш вариант в лоб решается так:
Заведите табличку сопоставлений типа документа с его идентификатором:

Код: Выделить всё

ID  DOC_TYPE NAME
0   C               Документ марки C 
1   D               Документ марки D
2   E               Документ марки E
3   F               Документ марки F
А в таблице с документами добавьте поле с ID
И выбирайте с WHERE 0/1/2/...
И перепишите запрос с новыми реалиями.

Ведь вам никто не гарантирует что запрос с русским символом 'C' будет совпадать со значением в котором представляется этот символ в базе :)

Re: Вопрос по синтаксису запроса.

Добавлено: 2010-01-18 13:41:58
Amadeus
Если бы все было бы так просто).

Единственное, что позволяет БД - это делать селекты к ней, так как редактирование таблиц и т.д - закрытая функция).

Re: Вопрос по синтаксису запроса.

Добавлено: 2010-01-18 19:23:49
Fastman
Amadeus писал(а):Если бы все было бы так просто).

Единственное, что позволяет БД - это делать селекты к ней, так как редактирование таблиц и т.д - закрытая функция).
Тогда сочувствую. Что курили разработчики - непонятно :) Тут главное теперь отследить... MSSQL не имеет настройки кодировки чтобы выполнить запрос либо в другом проблема.
Попробуйте что ли

Код: Выделить всё

WHERE type_doc LIKE '%С%'
но если это и сработает - будет сцуко медленный запрос :)

Проверить какие кодировки поддерживает база можно примерно так:

Код: Выделить всё

use db_name
go
select collation from syscolumns where id = object_id('plist') and name = 'Name'

Re: Вопрос по синтаксису запроса.

Добавлено: 2010-01-18 19:42:56
Amadeus
А какой из трех типов наиболее правильный?
Я про запросы которые в первом посте по синтаксису.

Что курили, кстати интереснй вопрос, но приходится работать с тем, что есть:).

Re: Вопрос по синтаксису запроса.

Добавлено: 2010-01-18 19:53:59
Fastman
Amadeus писал(а):А какой из трех типов наиболее правильный?
Я про запросы которые в первом посте по синтаксису.
Что курили, кстати интереснй вопрос, но приходится работать с тем, что есть:).
На мой взгляд - я бы никакой не пользовал. Я конечно не знаю ситуации... но уникальные номера генерировать методом +1 не совсем верно и безопасно и не гарантирует правильности.
Представьте что у вас 2 юзера теоретически выполнили запрос, им одновременно select вернул каунтер..они спокойно приплюсовали единицу и у вас в базе появилось 2 документа с одинаковым ID :)
Если распишете ситуацию подробнее - можно подумать... Тут может еще кто подскажет, я сваливаю на недельку в Киев, так что оперативно ответить не смогу :)