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

Откуда:
Сообщений: 48
задача

существует таблица со значениями по возрастающей согласно своего ключа
шаг 1 - моя задача пометить все значения
шаг 2 - починить значение если оно не коректно по крайней мера на то что было в предыдущей строке

пример 1:

1.      Select 1 as key ,1 as val 
2.	Select 1 as key ,2 as val 
3.	Select 1 as key ,3 as val 
4.	Select 1 as key ,2 as val 
5.	Select 1 as key ,5 as val 
6.	Select 1 as key ,6 as val 



4 строку надо починить
         Select 1 as key ,4 as val 


сделал UDF , при условии что надо починить одно значение UDPATE работает OK
однако если существует два значения не правильных : один после другого

пример 2:
1.      Select 1 as key ,1 as val 
2.	Select 1 as key ,2 as val 
3.	Select 1 as key ,3 as val 
4.	Select 1 as key ,2 as val 
5.	Select 1 as key ,1 as val 
6.	Select 1 as key ,6 as val 


к примеру строка 4 , 5

выходит что не смотря на то что значение строки 4 было починено UDF
когда пришел на значение строки 5 значение строки 4 осталось тоже как до UDPATE
22 янв 12, 17:14    [11947867]     Ответить | Цитировать Сообщить модератору
 Re: UDF UDPATE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
У вас ошибка в коде.
22 янв 12, 17:16    [11947872]     Ответить | Цитировать Сообщить модератору
 Re: UDF UDPATE  [new]
iap
Member

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

где UPDATE-то?
22 янв 12, 17:19    [11947881]     Ответить | Цитировать Сообщить модератору
 Re: UDF UDPATE  [new]
alwil
Member

Откуда:
Сообщений: 48
My Mistake :-)

Now is run OK

  --create table  tempA
  --(
  --ky int,
  --val int
  --)

truncate table tempA
  
  insert into tempA
    Select 1 as ky ,1 as val     
     insert into tempA 
	Select 2 as ky ,2 as val   
  insert into tempA
	Select 3 as ky ,3 as val	 
  insert into tempA
	Select 4 as ky ,2 as val	 
  insert into tempA
	Select 5 as ky ,1 as val 	
  insert into tempA
	Select 6 as ky ,6 as val
		
		
	update tempA set val= [dbo].[repairVal](ky, val)
	select * , [dbo].[repairVal](ky, val)  from tempA

go

alter FUNCTION [dbo].[repairVal]
(
      @ky int,
      @val int 
)
RETURNS int
as
begin

declare @int as int 

select @intg= val   
from  tempA	
where ky =@ky-1


if @val< @intg
return @intg
else 
return @val


return @val


end





Update
ky val repairedValue
1 1 1
2 2 2
3 3 3
4 3 3 --OK
5 2 3 --OK
6 6 6
22 янв 12, 18:33    [11948049]     Ответить | Цитировать Сообщить модератору
 Re: UDF UDPATE  [new]
iap
Member

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

а без функции никак? Это принципиально для Вас?
22 янв 12, 18:46    [11948089]     Ответить | Цитировать Сообщить модератору
 Re: UDF UDPATE  [new]
aleks2
Guest
declare @tempA table (ky int, val int) 

  insert into @tempA
    Select 1 as ky ,1 as val     
     insert into @tempA 
	Select 2 as ky ,2 as val   
  insert into @tempA
	Select 3 as ky ,3 as val	 
  insert into @tempA
	Select 4 as ky ,2 as val	 
  insert into @tempA
	Select 5 as ky ,1 as val 	
  insert into @tempA
	Select 6 as ky ,6 as val
		

select * from @tempA

DECLARE @rc int
set @rc=1

WHILE @rc>0 begin

	update T SET val=TT.val
	FROM @tempA T INNER JOIN @tempA TT ON TT.ky=T.ky-1
	WHERE T.val<TT.val

	set @rc=@@ROWCOUNT 
end


select * from @tempA
22 янв 12, 18:53    [11948116]     Ответить | Цитировать Сообщить модератору
 Re: UDF UDPATE  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гавриленко Сергей Алексеевич
У вас ошибка в коде.
И по ходу не только в TSQL коде.
Ну хотя бы так:
UPDATE	N
SET	val	= P.val + 1
FROM	     dbo.TempA N
	JOIN dbo.TempA P ON P.ky = N.ky - 1
	JOIN dbo.TempA L ON L.ky = P.ky - 1
WHERE	    P.val  = L.val + 1	-- Сходится
	AND N.val != P.val + 1	-- Не сходится


Но главное, непоколебимая вера в то, что если это сказано словами, значит это правильно и возможно.
починить значение если оно не коректно
по крайней мера на то что было в предыдущей строке
Бла-бла-бла. Мышление типичного неанде императивиста.
22 янв 12, 18:53    [11948118]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить