- 1
- 2
- 3
- 4
create table #tt( value int )
declare @v int = 1
select @v = value from #tt
select @v
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−174
create table #tt( value int )
declare @v int = 1
select @v = value from #tt
select @v
вот это поворот.. почему 1? null же должен быть по здравой логике!
написал сейчас цикл
declare @FileId int
Select @fileid = fileid from #tmp
while @FileId is not null
begin
exec dsd.process_File_RollBack @FileId
delete from #tmp where fileid = @fileid
Select @fileid = fileid from #tmp
end
Bart 11.04.2014 09:12 # +1
Lokich 11.04.2014 11:29 # 0
bliznezz 11.04.2014 13:41 # +1
bormand 11.04.2014 09:21 # 0
Скорее всего просто не меняет значение, и остается единичка от предыдущей итерации.
guest 11.04.2014 11:06 # +2
defecate-plusplus 11.04.2014 11:49 # +1
а если бы было 3 строки, то какое бы значение сохранилось в переменной?
Lokich 11.04.2014 12:04 # −1
возвращает 4, если конечно сортировок не задавать
bormand 11.04.2014 12:22 # +4
Если сортировок не задавать - оно возвращает не 4, а некое значение. Которое зависит от того, с какой ноги встал разраб СУБД, фазы луны и популяции шушпанчиков в созвездии альфа-центавра. Юзать такую конструкцию без сортировок или лимита на 1 строку - ССЗБ.
defecate-plusplus 11.04.2014 11:48 # +2
пф
exception no_data_found должно быть по здравой логике!
Lokich 11.04.2014 12:07 # 0
bormand 11.04.2014 12:09 # 0
Lokich 11.04.2014 12:12 # 0
bormand 11.04.2014 12:18 # +1
Затем, что тебе нужна ровно одна строка. И если запрос не вернул ни одной строки, или вернул 2, 42 или 100500 строк - это ошибка. А на ошибку вполне логично кидать исключение.
defecate-plusplus 11.04.2014 12:22 # 0
как ты различишь select null into v1 from dual; от select real_value into v1 from foobar where real_condition_failed;
по побочной переменой rowcount (подозреваю, что в ms-sql такая тоже должна быть)?
зачем, когда есть верный механизм исключений
аналогично и про too_many_rows - ты не имеешь право задать последнее или любое другое значение в переменную, если у тебя в результате более одной строки - они все равноправны, и попытка их занести в одну переменную свидетельствует об исключительной ситуации
Lokich 11.04.2014 12:52 # +3
laMer007 11.04.2014 13:00 # +1
Lokich 11.04.2014 13:13 # 0
defecate-plusplus 11.04.2014 14:59 # +2
это мелкософт тебя принудил
именно с этого я и начал - что это задача СУБД кинуть исключение, а не позволять творить всякую непотребщину
Lokich 11.04.2014 15:09 # 0
bormand 11.04.2014 15:26 # +1
Вот это вот самая настоящая непотребщина ;) Мало того, что возвращает хрен-бы-знал-что. Так еще поди и пробегается по всему результсету перед этим...
DBdev 11.04.2014 13:13 # 0
Дайте угадаю, под фейлом подразумевается возвращаемый пустой набор данных?
Lokich 11.04.2014 13:16 # 0
и кстати да, тупо получится. скажем юзер фильтрует что-то в интерфейсе, указал предикаты, по которым нет данных, и словил эксепшн :)
bormand 11.04.2014 14:43 # +1
Да нет же, ты не понял мысль :) Зачем на любой пустой набор кидать экцепшн? Если юзеру показывают грид или оббегают результсет курсором - исключение не нужно, т.к. прога готова принять и 0 и 100500 строк. Если там аггрегация - тоже не нужно исключение, т.к. все аггрегирующие функции нормально работают с пустыми множествами.
Если же в коде явно написано, что нужно выбрать ровно одну строку и распихать ее поля по переменным - то исключение при количестве строк != 1 спасет от головной боли в будущем :)
Lokich 11.04.2014 14:49 # 0
bormand 11.04.2014 15:06 # 0
Фе, еще один лишний запрос... Тогда уж просто обNULLи переменную перед select'ом, как советует выше bliznezz. Ну и в самом селекте не помешал бы limit 1, ибо нафиг нам оббегать все записи, если мы возьмем только одну...
P.S. Вот если честно, я никак не пойму, зачем удалять файлы именно sql серваком. Может проще сделать это с прикладной стороны? ;)
Lokich 11.04.2014 17:07 # 0
Lokich 11.04.2014 12:06 # 0
eth0 11.04.2014 21:03 # +3
DBdev 11.04.2014 12:14 # +2
NULL
Msg 512, Level 16, State 1, Line 7
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Хватит использовать микроскоп вместо молотка!
bliznezz 11.04.2014 13:37 # 0
а то понапридумывали циклов по множеству с ручным недоуправлением.