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

Откуда:
Сообщений: 27
Всем доброго времени суток. Есть процедура Interbase. Она работает следующим образом, по одной машине может быть больше двух записей, т.е. с разной готовностью работы, а может быть и одна запись. Мне эту процедуру надо перевести на MS SQL.

Процедура Interbase -

if (:priznak=7 ) then     
  begin
          n_=0; m_=0;
      OUT_NP=''; out_vr='';
     for select a.code_eq, a.gt, a.code_s  from Work a where  a.code_eq = :in_nm  into :out_nm,:out_gt,:np
     do begin
           if (:np >0) then
           begin
              select substr(nm,1,6) from spr_n where Kd= :np into :nm;
                if (:n_ >=1) then begin 
                  OUT_NP = OUT_NP ||'/';
                  OUT_VR = OUT_VR ||'/';
                end
                   OUT_NP = OUT_NP || :nm ;
                  m_=EXTRACT(MINUTE FROM :out_gt);
                  if (m_<=0) then m_c='00';
                  else m_c=m_;
        
                   OUT_VR = OUT_VR ||EXTRACT(HOUR FROM :out_gt)||':'|| m_c;
              n_=n_+1;
           end
         end
  end


Её значения необходимых выходных параметров -
out_nm = 1000; out_np = Станция1/Станция2; out_vr = 21:00/22:00 (разное время готовности)

Сделала на MS SQL табличную функцию -

ALTER FUNCTION [dbo].[FWork] (@IN_NM int, @IN_D date, @IN_NC int)
RETURNS @NAP TABLE 



(out_np varchar (30),
 code_eq int,
 out_vr varchar(30), 
 code_st int)


AS

BEGIN


DECLARE

		
 @code_eq int,
 @out_gt datetime,
 @code_st int,
 @name varchar,
 @out_np varchar(30),
 @out_vr varchar(30),
 @col_rec int;

	set @out_np = '';
	set @out_vr ='';
	
		
			
		select @col_rec=count(A.code_eq) from dbo.Work A inner join dbo.spr_n B on A.code_st=B.code where  A.code_eq = @IN_NM and A.data=@IN_D and A.NC=@IN_NC
		
			if @col_rec>1
			
				select @out_np=@out_np+substring(B.NAME,1,6)+'/',@code_eq=A.code_eq, 
					@out_vr=@out_vr+cast(DATEPART(hour,A.gt)as varchar)+':'+cast(DATEPART(minute,A.gt)as varchar)+'/', 
					@code_st=A.code_st  from dbo.Work A inner join dbo.spr_n B on A.code_st=B.code where  A.code_eq = @IN_NM and A.data=@IN_D and A.NC=@IN_NC
			
			else
				select @out_np=@out_np+substring(B.NAME,1,6),@code_eq=A.code_eq, 
					@out_vr=@out_vr+cast(DATEPART(hour,A.gt)as varchar)+':'+cast(DATEPART(minute,A.gt)as varchar), 
					@code_st=A.code_st  from dbo.Work A inner join dbo.spr_n B on A.code_st=B.code where  A.code_eq = @IN_NM and A.data=@IN_D and A.NC=@IN_NC

			
			
   IF @IN_NMASH IS NOT NULL 
    BEGIN
        INSERT @NAP
		SELECT @out_np,@code_eq,@out_vr,@code_st
    END;

RETURN 
END

Результат этой функции -

code_eq = 1000; out_np = Станция1/Станция2/; out_vr = 21:00/22:00/ - Лишние "/" в конце out_np и out_vr.

Как сделать, чтобы не было лишних "/" в конце out_np и out_vr? За код сильно тапками не кидайте, самой не нравится, думаю как сделать лучше. Заранее спасибо.

Сообщение было отредактировано: 27 окт 17, 13:26
27 окт 17, 13:04    [20906181]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase на MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7757
eclipse170790,

пишите палки не в конец, а в начало, потом применяйте stuff() к итоговой строке и выбрасывайте первый символ.
27 окт 17, 13:09    [20906233]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase на MS SQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
Владислав Колосов, спасибо, попробую.
27 окт 17, 13:14    [20906263]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase на MS SQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
Владислав Колосов, сделала так -

select @out_np='/'+@out_np+substring(B.NAME,1,6),@code_equip=A.code_eq,
@out_vr='/'+@out_vrem+cast(DATEPART(hour,A.gt)as varchar)+':'+cast(DATEPART(minute,A.gt)as varchar),

Результат такой -

out_np - //Станция1Станция2; out_vr //21:0022:00.

Куда Stuff ставить? Мне нужно, чтобы вышло так - out_np - Станция1/Станция2 out_vr - 21:00/22:00
27 окт 17, 13:55    [20906518]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase на MS SQL  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
eclipse170790,

Смешно :)

	select 
		@out_np=@out_np+'/'+substring(B.NAME,1,6),
		@code_equip=A.code_eq, 
		@out_vr=@out_vrem+'/'+cast(DATEPART(hour,A.gt)as varchar)+':'+cast(DATEPART(minute,A.gt)as varchar)
select 
	@out_np=STUFF(@out_np,1,1,''), 
	@out_vr=STUFF(@out_vr,1,1,'')
27 окт 17, 14:50    [20906860]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase на MS SQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
Шыфл, спасибо, но не так. Мне нужно так - out_np=Станция1/Станция2; out_vr = 21:00/22:00. Думаю, делать по-своему варианту, но использовать определение длины строки и убирать через
stuff
последний символ.
30 окт 17, 08:20    [20910930]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase на MS SQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
Всё, вроде сделала. Определила последний символ, и если он равен "/", то вырезаю через STUFF. Всем, спасибо за помощь.
30 окт 17, 10:07    [20911112]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить