2014-01-26 4 views
0

Новые хранимые процедуры. У меня есть таблица со следующими два колоннамиSQL Server 2008 Сохраненная процедура Выберите столбец из последней строки таблицы, используя столбец ORDER BY DESC

ID (identity) 
NoPro = CCNNN where CC = Country Code and NNN sequential number within country 

данные:

1 AR101 
2 AR102 
3 AR103 
4 BO101 
5 BO102 
6 BR101 
7 BR102 

В хранимой процедуре я хочу получить доступ к последнему проекту для конкретной страны, с тем, чтобы назначить следующий номер проекта для этого страна.

Я попытался следующий код:

select @sNo = [NoPro] 
from projects 
where substring([NoPro], 1, 2) = @Country 
order by NoPro DESC 

Если я использую AR для страны я AR101 в то время как я ожидал AR103.

Что мне не хватает?

Спасибо!

+0

Просьба опубликовать полный исходный код для генерации новых значений для 'NoPro'. –

ответ

1

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

Дизайн, который у вас есть, немного хлопотно, когда дело доходит до параллелизма, поэтому, пожалуйста, создайте уникальное ограничение на NoPro, чтобы предотвратить дубликаты.

select @sNo = max(NoPro) 
from projects 
where NoPro like @Country+'%'; 
+0

Думаю, я сделал это более сложным, чем нужно: D –

+0

Да, похоже. Также похоже, что вы используете псевдоним столбца в предложении where во втором решении. –

+0

Нет, нет, я нахожусь здесь по телефону и не могу видеть прямо. –

1

Другой способ решения этой проблемы является использование top:

select top 1 @sNo = [NoPro] 
from projects 
where substring([NoPro], 1, 2) = @Country 
order by NoPro DESC; 

Ваш запрос возвращает несколько строк. Назначение на @sNo либо произвольное, либо последнее обработанное значение - я не уверен, что SQL Server гарантирует это. В любом случае решение состоит в том, чтобы исправить запрос, чтобы вернуть одно значение.

+0

Это решение почти в 4 раза дороже, чем предложил Микаэль. –

+0

@ M.Ali. , , Интересно. Я предложил это, потому что он наиболее похож на исходный запрос OP. Я не понимал, что производительность будет намного хуже. –

+0

См. Здесь http://postimg.org/image/i1ijrvcrn/ –

Смежные вопросы