Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 While  [new]
intruders
Member

Откуда:
Сообщений: 140
День добрый. Во временной таблице есть списко с 001 по 314 и плюс есть запись 343. Пробывал ниже перечисленным способом, цикл работает только до 314 записи, а 343 почему то пропускает.
declare @nfile varchar(20) 
declare @counter int

declare @data varchar(10)
set @data='05.07.2011'


--drop table #ID
--select  distinct id_key into #ID  from from_fz order by id_key

set @counter=1
while Exists (select * from #ID where id_key=@counter)
begin
	if len(@counter)=1
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.00'+cast(@counter as varchar(1))
	if len(@counter)=2
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.0'+cast(@counter as varchar(2))
	if len(@counter)=3
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2) +'N.'+cast(@counter as varchar(3))

	print @nfile
		set @counter=@counter+1
end
12 июл 11, 13:12    [10961128]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А почему не должен пропускать?
12 июл 11, 13:12    [10961135]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
...while Exists (select * from #ID where id_key >= @counter)...
12 июл 11, 13:13    [10961146]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
imato
Member

Откуда: Москва
Сообщений: 80
Knyazev Alexey
...while Exists (select * from #ID where id_key >= @counter)...


да, на 315-м у вас условие не будет выполнятся и все, end

declare @max int
select @max=max(id_key) from #ID

wheke @counter <= @max
begin
...
end
12 июл 11, 13:18    [10961171]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
intruders
Member

Откуда:
Сообщений: 140
всеровно получаеться с 315 по 343 заполняет
12 июл 11, 13:23    [10961213]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
Glory
Member

Откуда:
Сообщений: 104751
intruders
всеровно получаеться с 315 по 343 заполняет

Ну а как по-вашему должно вычисляться set @counter=@counter+1 ?
Из 314 +1 должно получиться сразу 343 ?
12 июл 11, 13:26    [10961240]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
intruders
Member

Откуда:
Сообщений: 140
да вот в том то и дело что по сути правельно. Как то можно исключить этот промежуток
12 июл 11, 13:30    [10961261]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
imato
Knyazev Alexey
...while Exists (select * from #ID where id_key >= @counter)...


да, на 315-м у вас условие не будет выполнятся и все, end



и с чего это на 315 это условие не выполнится?!
12 июл 11, 13:31    [10961283]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
intruders
да вот в том то и дело что по сути правельно.
"Правельно" по сути будет, когда запрос будет по сути работать.
intruders
Как то можно исключить этот промежуток
Написать "правельный" код.
12 июл 11, 13:32    [10961289]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Как то так

declare @nfile varchar(20) 
declare @counter int

declare @data varchar(10)
set @data='05.07.2011'


--drop table #ID
--select  distinct id_key into #ID  from from_fz order by id_key

set @counter=1
while Exists (select * from #ID where id_key>=@counter)
begin
	if len(@counter)=1
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.00'+cast(@counter as varchar(1))
	if len(@counter)=2
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.0'+cast(@counter as varchar(2))
	if len(@counter)=3
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2) +'N.'+cast(@counter as varchar(3))

	print @nfile
		set @counter=(select min(id_key) from #ID where id_key>@counter)
end
12 июл 11, 13:48    [10961384]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
_WHILE___
Guest
а опчему бы тогда не так
angel_zar
Как то так

declare @nfile varchar(20) 
declare @counter int

declare @data varchar(10)
set @data='05.07.2011'


--drop table #ID
--select  distinct id_key into #ID  from from_fz order by id_key

set @counter=1
--while Exists (select * from #ID where id_key>=@counter)
while @counter is not null
begin
	if len(@counter)=1
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.00'+cast(@counter as varchar(1))
	if len(@counter)=2
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.0'+cast(@counter as varchar(2))
	if len(@counter)=3
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2) +'N.'+cast(@counter as varchar(3))

	print @nfile
		select @counter = min(id_key) from #ID where id_key>@counter
--                       set @counter=(select min(id_key) from #ID where id_key>@counter)
end
12 июл 11, 13:56    [10961422]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
_WHILE___
Guest
и еще
set @counter=1

заменить на
select @counter = min(id_key) from #ID 
12 июл 11, 13:58    [10961435]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Ничего из написанного не понял...

declare @data varchar(10)
set @data='05.07.2011'

SELECT  'VD0' + substring(@data,1,2) + substring(@data,4,2) + 'N.' + RIGHT('000' + CAST(id_key AS varchar(10)), 3) FROM from #ID 


Сообщение было отредактировано: 12 июл 11, 13:59
12 июл 11, 13:59    [10961441]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
intruders
declare @nfile varchar(20) 
declare @counter int

declare @data varchar(10)
set @data='05.07.2011'


--drop table #ID
--select  distinct id_key into #ID  from from_fz order by id_key

set @counter=1
while Exists (select * from #ID where id_key=@counter)
begin
	if len(@counter)=1
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.00'+cast(@counter as varchar(1))
	if len(@counter)=2
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.0'+cast(@counter as varchar(2))
	if len(@counter)=3
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2) +'N.'+cast(@counter as varchar(3))

	print @nfile
		set @counter=@counter+1
end
А что делает эта гениальная программа?

WHILE уместно в программе на C, C++, C#, Pascal и т.п.
Здесь-то оно зачем?!
12 июл 11, 14:09    [10961514]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
+5 коп
Guest
Открой для себя курсоры
DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName FROM Northwind.dbo.Employees
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
   FETCH NEXT FROM Employee_Cursor
END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor
12 июл 11, 14:18    [10961577]     Ответить | Цитировать Сообщить модератору
 Re: While  [new]
+5 коп
Guest
Дополнение - fetch надо использовать с помещением значения поля в переменную:
declare @counter int

DECLARE myCrs CURSOR FOR
SELECT select * from #ID
OPEN myCrs

WHILE 0=0
BEGIN
  FETCH NEXT FROM myCrs INTO @counter
  IF NOT @@FETCH_STATUS = 0 BREAK

	if len(@counter)=1
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.00'+cast(@counter as varchar(1))
	if len(@counter)=2
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2)+'N.0'+cast(@counter as varchar(2))
	if len(@counter)=3
		set @nfile='VD0'+substring(@data,1,2)+substring(@data,4,2) +'N.'+cast(@counter as varchar(3))

	print @nfile

END

CLOSE myCrs
DEALLOCATE myCrs

Ненавижу BOL за "куцые" примеры
12 июл 11, 14:28    [10961644]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить