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

Откуда:
Сообщений: 17
Помогите,пожалуйста, разобраться с процедурой.
При выполнении запроса из курсора информация выводится полностью.

При запуске процедуры,приведенной, ниже информация выводится не в полном объеме,т.е.
Номер заказа В сушке
01101501 53 01101502 96 01101503 72
01101504 57 01101505 89 01101506 65
01101507 112 01121501 5308 03021603 2256
03091501 51 03091502 108 03091508 79
03091509 60 03091510 68 03091511 86
05081501 21 07091502 73 08021608 8680
09121501 19766 12011608 19594 15071501 149
17121501 19984 19011607 19995 22011606 8675
22121501 19994 22121502 19681 24071501 670
24111501 200 26011613 11320 28011619 10000
28101503 14675 31071516 91
Номер заказа Готово
31071516 91
Номер заказа Полуфабрикаты
31071516 91
Номер заказа Готово к передаче
31071516 91

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


+
BEGIN
	SET NOCOUNT ON;
	
	SET DATEFORMAT 'dmy'  -- 'ymd'
	
	declare @INC_NUMBER	varchar(12)
	declare @cnt int
	declare @header varchar(max)
	
	set @INC_NUMBER = null
	set @cnt= 0
	set @header = ''
	--set @INC_NUMBER = '26011613'
	
			BEGIN TRY
		SET LOCK_TIMEOUT 5000;
						if (@INC_NUMBER is null or @INC_NUMBER = '')	
								begin	
					declare cur cursor for
						select  job.INC_NUMBER, count(pcb.rid)  from [12TON_PCBS] pcb  
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
										where pcb.STR_DRYING_DATE is not NULL and
											(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and  
											WANTED != 1 and
											REJECTED is NULL   
											group by job.INC_NUMBER				
								end				
						else
							begin
					declare cur cursor for			
						select  job.INC_NUMBER, count(pcb.rid)  from [12TON_PCBS] pcb  
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
									where pcb.STR_DRYING_DATE is not NULL and
										(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and  
										WANTED != 1 and
										REJECTED is NULL   and
										job.INC_NUMBER  = LTRIM(RTRIM(@INC_NUMBER))
										group by job.INC_NUMBER					
						end			
																				
					open cur
						fetch next from cur into @INC_NUMBER, @cnt
										if (@cnt>0)	
											begin
												set @header = @header + 'mtabltr' +  CHAR (10)
												set @header = @header +	'Номер заказа '  +  CHAR (10)
												set @header = @header +	'Плат в сушке ' +  CHAR (10)
											end	
										WHILE @@FETCH_STATUS = 0
											begin 
						set @header = @header + CONVERT(CHAR(14),ISNULL(@INC_NUMBER,'NULL'))+  CHAR (10) ;
						set @header = @header + CONVERT(CHAR(30),ISNULL(@cnt,0))  + CHAR (10);
						fetch next from cur into @INC_NUMBER, @cnt
											end				
										
					close cur  
				deallocate cur
				eND TRY
				
				BEGIN CATCH
							set @header = @header + 'Невозможно получить данные';
				END CATCH	
		
			BEGIN TRY
		SET LOCK_TIMEOUT 5000;
			if (@INC_NUMBER is null or @INC_NUMBER = '')	
					declare cur cursor for	
						select  job.INC_NUMBER,count(pcb.rid) from [12TON_PCBS] pcb
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
									where pcb.STR_DRYING_DATE is not NULL and
										pcb.REG_SMT_DATE is not NULL and
										(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and
										WANTED != 1 and
										REJECTED is NULL  
										group by job.INC_NUMBER
					else 
					     declare cur cursor for			
						select  job.INC_NUMBER,count(pcb.rid) from [12TON_PCBS] pcb
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
									where pcb.STR_DRYING_DATE is not NULL and
										pcb.REG_SMT_DATE is not NULL and
										(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and
										WANTED != 1 and
										REJECTED is NULL  and
										job.INC_NUMBER = LTRIM(RTRIM(@INC_NUMBER)) 
										group by job.INC_NUMBER
					open cur
						fetch next from cur into @INC_NUMBER, @cnt
										if (@cnt>0)	
										begin		
												begin
											set @header = @header +	'Номер заказа '  + CHAR (10)
											set @header = @header + 'Плат готовых к сборке ' + CHAR (10)
												end	
											WHILE @@FETCH_STATUS = 0								
												begin 
							set @header = @header + CONVERT(VARCHAR(14),ISNULL(@INC_NUMBER,'NULL'))+  CHAR (10) ; 
							set @header = @header + CONVERT(VARCHAR(14),ISNULL(@cnt,0))  + CHAR (10);		
											fetch next from cur into @INC_NUMBER, @cnt
												end
										end
									else
										begin
											set @header =@header + ''
										end					
					close cur  
					deallocate cur	
				eND TRY
				
				BEGIN CATCH
							set @header = @header + 'Невозможно получить данные';
				END CATCH		
		
			BEGIN TRY
		SET LOCK_TIMEOUT 5000;
			if (@INC_NUMBER is null or @INC_NUMBER = '')
					declare cur cursor for																
						select  job.INC_NUMBER,count(pcb.rid) from [12TON_PCBS] pcb
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
										where pcb.STR_DRYING_DATE is not NULL and
											pcb.REG_SMT_DATE is not NULL and
											pcb.BTM_READY_DATE is not NULL and
											(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and
											WANTED != 1 and
											REJECTED is NULL 
											group by job.INC_NUMBER
					else
					     declare cur cursor for			
						select  job.INC_NUMBER,count(pcb.rid) from [12TON_PCBS] pcb
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
										where pcb.STR_DRYING_DATE is not NULL and
											pcb.REG_SMT_DATE is not NULL and
											pcb.BTM_READY_DATE is not NULL and
											(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and
											WANTED != 1 and
											REJECTED is NULL and
											job.INC_NUMBER = LTRIM(RTRIM( @INC_NUMBER  ))
											group by job.INC_NUMBER		
					open cur
						fetch next from cur into @INC_NUMBER, @cnt
										if (@cnt>0)			
											begin	
												set @header = @header +	'Номер заказа ' + CHAR(10)
												set @header = @header +	'Полуфабрикаты' + CHAR(10)
											end	
										WHILE @@FETCH_STATUS = 0
											begin 
							set @header = @header + CONVERT(CHAR(14),ISNULL(@INC_NUMBER,'NULL'))+  CHAR (10) ;
							set @header = @header + CONVERT(CHAR(30),ISNULL(@cnt,0))  + CHAR (10);	
										fetch next from cur into @INC_NUMBER, @cnt
											end
						
					close cur  
					deallocate cur
				eND TRY
				
				BEGIN CATCH
							set @header = @header + 'Невозможно получить данные';
				END CATCH	

			BEGIN TRY
		SET LOCK_TIMEOUT 5000;
				if (@INC_NUMBER is null or @INC_NUMBER = '')
					declare cur cursor for		
						select  job.INC_NUMBER,count(pcb.rid) from [12TON_PCBS] pcb
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
								where pcb.STR_DRYING_DATE is not NULL and
									pcb.REG_SMT_DATE is not NULL and
									pcb.BTM_READY_DATE is not NULL and
									pcb.TOP_READY_DATE is not NULL and
									(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and
									WANTED != 1 and
									REJECTED is NULL 
									group by job.INC_NUMBER
					else
					     declare cur cursor for			
					select  job.INC_NUMBER,count(pcb.rid) from [12TON_PCBS] pcb
			join  LAYOUT_CODING_INFO job on substring(pcb.BARCODE,5,8)=job.INC_NUMBER and job.INC_NUMBER<>77777777
								where pcb.STR_DRYING_DATE is not NULL and
									pcb.REG_SMT_DATE is not NULL and
									pcb.BTM_READY_DATE is not NULL and
									pcb.TOP_READY_DATE is not NULL and
									(pcb.BAD_STATUS = 0 or pcb.BAD_STATUS = 2) and
									WANTED != 1 and
									REJECTED is NULL and
									job.INC_NUMBER = LTRIM(RTRIM(@INC_NUMBER)) 
									group by job.INC_NUMBER
												
																					
					open cur
						fetch next from cur into @INC_NUMBER, @cnt
										if (@cnt>0)			
											begin	
											set @header = @header + 'Номер заказа '+  CHAR(10)
											set @header = @header + 'Готово к передаче на АОИ    ' + CHAR(10)
											end	
										WHILE @@FETCH_STATUS = 0
											begin 
							set @header = @header + CONVERT(CHAR(14),ISNULL(@INC_NUMBER,'NULL'))+  CHAR (10) ;
							set @header = @header + CONVERT(CHAR(30),ISNULL(@cnt,0))  + CHAR (10);	
										fetch next from cur into @INC_NUMBER, @cnt
											end
					close cur  
					deallocate cur
			eND TRY
			
			BEGIN CATCH
						set @header = @header + 'Невозможно получить данные';
			END CATCH 
			
	
	
			begin
				select @header
			end 					
end


Сообщение было отредактировано: 1 мар 16, 16:49
1 мар 16, 16:46    [18883450]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
LVeta,

я сломал себе глаза! Срочно пришлите 100 тыщ рублей на лечение!
1 мар 16, 16:50    [18883474]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
LVeta,

я сломал себе глаза! Срочно пришлите 100 тыщ рублей на лечение!
Форматирование появилось только что! Так нечестно!
1 мар 16, 16:51    [18883483]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
LVeta,

как проверяете, что результат неполный?
1 мар 16, 16:52    [18883497]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
LVeta
При запуске процедуры,приведенной, ниже информация выводится не в полном объеме,т.е.

Наверное потому, что запрос выводит записи, а не собирает их содержимое в одну переменную.
Вы не пробовали проверять, что ваш скрипт заносит в ваши переменные ?
1 мар 16, 16:53    [18883505]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
LVeta
Member

Откуда:
Сообщений: 17
В переменную он помещает следующие значения
Номер заказа В сушке
01101501 53 01101502 96 01101503 72
01101504 57 01101505 89 01101506 65
01101507 112 01121501 5308 03021603 2256
03091501 51 03091502 108 03091508 79
03091509 60 03091510 68 03091511 86
05081501 21 07091502 73 08021608 8680
09121501 19766 12011608 19594 15071501 149
17121501 19984 19011607 19995 22011606 8675
22121501 19994 22121502 19681 24071501 670
24111501 200 26011613 11320 28011619 10000
28101503 14675 31071516 91
Номер заказа Готово
31071516 91
Номер заказа Полуфабрикаты
31071516 91
Номер заказа Готово к передаче
31071516 91


Хотя последние три раздела должны иметь больше строк, но почему то не выводит.Хотя в все запросы в курсорах выводят больше одой строки. Проверяла кол-во символов, которые может в себе содержать переменная тип varchar(max).По длине данные должны были поместится.Но почему этого не произошла не могу понять.
1 мар 16, 17:02    [18883576]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
LVeta
В переменную он помещает следующие значения

И как вы проверили, что он это делает ?

LVeta
.Но почему этого не произошла не могу понять.

Наверное потому, что вы такой код написали. Или вам кажется, что код прекрасен, а проблема в сервере ?
1 мар 16, 17:04    [18883589]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
LVeta
Member

Откуда:
Сообщений: 17
Код не прекрасен, но других вариантов вывода данного отчета я не нашла.
Для каждого пункта считала кол-во символов и выводила на экран.
1 мар 16, 17:08    [18883619]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
LVeta
Код не прекрасен, но других вариантов вывода данного отчета я не нашла.

Ну так может тогда надо заняться отладкой этого кода ?
1 мар 16, 17:09    [18883626]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
LVeta
Member

Откуда:
Сообщений: 17
Представляете, я этим уже давно занимаюсь, но все равно не получается получить нужного результата
1 мар 16, 17:28    [18883750]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
LVeta
Представляете, я этим уже давно занимаюсь,

И каким же средствами вы это делаете ?

LVeta
но все равно не получается получить нужного результата

Вы какого решения то здесь ожидаете ?
Ответа вроде - у вас ошибка в 17ой строке ?
1 мар 16, 17:33    [18883772]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
LVeta
Member

Откуда:
Сообщений: 17
Нет мне просто интересно кто нибудь сталкивался с такой проблемой.
И еще если в переменную типа varchar (max) поместить более 8000 символов, то проста та информация не будет выведена.А если символов меньше, то все должно вывестись, но по какой причине не выводится тогда?
1 мар 16, 17:44    [18883835]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
LVeta
Нет мне просто интересно кто нибудь сталкивался с такой проблемой.

С проблемой кода, который не делает то, что ожидается, сталкивались тысячи

LVeta
И еще если в переменную типа varchar (max) поместить более 8000 символов, то проста та информация не будет выведена.

Открою вам секрет. Сервер ничего никуда не выводит. То, что вы видите у себя на экране в каком то приложение вам "вывело" это самое приложение
1 мар 16, 17:49    [18883864]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
LVeta
Представляете, я этим уже давно занимаюсь, но все равно не получается получить нужного результата
Ну вы для начала хотя бы убрали вашу переменную @header, курсоры, и оставив вместо них просто SELECT-ы?
Это вроде как самый простой способ понять, что происходит.
LVeta
Помогите,пожалуйста, разобраться с процедурой.
Как вы себе это представляете? Это можно сделать, имея ваш сервер с вашими таблицами и данными. Больше никак.
1 мар 16, 21:22    [18884644]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
LVeta
Member

Откуда:
Сообщений: 17
Спасибо.Разобралась.Проблема была в курсоре.
2 мар 16, 12:23    [18886909]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
LVeta
Спасибо.Разобралась.Проблема была в курсоре.

И что сразу то мешало разобраться в своем же коде ?
2 мар 16, 12:25    [18886925]     Ответить | Цитировать Сообщить модератору
 Re: Не выводит все данные запроса в переменную типа varchar  [new]
aleks2
Guest
Glory
LVeta
Спасибо.Разобралась.Проблема была в курсоре.

И что сразу то мешало разобраться в своем же коде ?

Дык, лень же.
Всегда ж хочется чтобы оно работало "как надо".
3 мар 16, 08:13    [18890335]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить