Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Доброго времени суток.
Я сразу скажу что я не умею писать на MsSql.
А учился на oracle. И столкнулся с одной проблемой.
Я не могу даже переписать простейшие 1 функцию и 1 процедуру на MsSql 2005.
Добрые люди помогите plz.
Заранее благодарен за помошь.

create or replace function f_CubePerList(idDim in integer) return varchar2 is
  Result varchar2(4000);
  cursor crsdim_p is select * from ItemDimens where Dimens=idDim;
  crsdim_pList crsdim_p%rowtype;
  cursor crsassDimP is select * from  detparamdimens where Paramdimens in 
  (select id from Paramdimens where itemdimens=crsdim_pList.Id and TypParam=6);
  crsassDimP_List crsassDimP%rowtype;
  cursor crsp is select * from vwPeriod where kind=crsdim_pList.Kind and dbeg>=crsassDimP_List.Dbeg and dend<=crsassDimP_List.Dend;
  crsp_list crsp%rowtype;
  cursor crspSovp is select * from vwPeriod where kind=crsdim_pList.Kind and dbeg=crsassDimP_List.Dbeg and dend=crsassDimP_List.Dend;
  crspSovp_list crspSovp%rowtype;
  adbeg date;
  adend date;
  cursor crspAll is select * from vwPeriod where kind=crsdim_pList.Kind and dbeg>=adbeg and dend<=adend;
  crspAll_list crspAll%rowtype; 
  i integer;
  plist varchar2(4000);
begin
  Result:='';
  i:=0;
  adbeg:=to_date('01.01.1900','dd.mm.yyyy');
  adend:=to_date('31.12.3333','dd.mm.yyyy');
  open crsdim_p;
  loop
    fetch crsdim_p into crsdim_pList;
    exit when crsdim_p%notfound;
    i:=0;
    open crsassDimP;
    loop
      fetch crsassDimP into crsassDimP_List;
      exit when crsassDimP%notfound;
      adbeg:=crsassDimP_List.Dbeg;
      adend:=crsassDimP_List.Dend;
      if crsassDimP_List.Issovp=0 then
        open crsp;
        loop
          fetch crsp into crsp_list;
          exit when crsp%notfound;
          plist:=plist||to_char(crsp_List.Id)||',';
        end loop;
        close crsp;
      else
        open crspSovp;
        loop
          fetch crspSovp into crspSovp_list;
          exit when crspSovp%notfound;
          plist:=plist||to_char(crspSovp_List.Id)||',';
        end loop;
        close crspSovp;
      end if;
      i:=i+1;
    end loop;
    if i=0 then
      open crspAll;
      loop
        fetch crspAll into crspAll_list;
        exit when crspAll%notfound;
        plist:=plist||to_char(crspAll_List.Id)||',';
        
      end loop;
      close crspAll;
    end if;
    close crsassDimP; 
  end loop;
  close crsdim_p; 
  result:=rtrim(plist,',');
--  select rtrim(plist,',') into result from dual;
  return(Result);
end f_CubePerList; 

create or replace procedure sp_createCubeMeter(idCube in integer, isExists in integer default 0) is
  cursor crsCube is select * from Stdcubemeter where id=idCube;
  crsCubeList crsCube%rowtype;
  
  cursor crsdim_m is select * from Dimensprocubemeter where Procubemeter=crsCubeList.Procubemeter order by ord;
  crsdim_mList crsdim_m%rowtype;
     
  cubeuser varchar(60);
  cubetable varchar(80);
  sqltable varchar(4000);
  sqldofrom varchar(4000);
  sqlsFrom varChar(4000);
  sqlsFrom2 varChar(4000);
  i integer;
  k integer;
  iduserCube integer;
  cntDim integer;
begin
/* begin
  select username into cubeuser from all_users where username=user||'_CUBE';
  exception
    when no_data_found then
    cubeuser:=user||'_CUBE';
--    cur := dbms_sql.open_cursor;
--    dbms_sql.parse(cur, 'create user '||cubeuser||' identified by qqq', dbms_sql.v7);    
--    ret:=dbms_sql.execute(cur);
    execute immediate 'create user '||cubeuser||' identified by qqq';
    execute immediate 'grant dba to '||cubeuser;   
  end;
*/
  open crsCube;
  fetch crscube into crsCubeList;
  select count(*) into cntDim from Dimensprocubemeter where ProCubeMeter=crsCubeList.Procubemeter;
  close crscube;
  if cntDim=0 then
    return;
  end if;  
  begin
--  select name into cubetable from sys.obj$ where Owner=iduserCube and name='CUBE_'||to_char(idcube);
--  cubetable:='CUBE_'||to_char(idcube);
  select table_name into cubetable from all_tables where Owner=user and table_name='CUBEM_'||to_char(idcube);
  
  if ((cubetable is not null) and (isExists=0)) then
    return;
  end if;
  
  execute immediate 'drop table '||cubetable;
  exception
    when no_data_found then
    cubetable:='CUBEM_'||to_char(idcube);
  end;
  
  sqltable:='create table '||cubetable||'(id integer default 0 not null primary key, 
            idData integer default 0, MeasureFict FLOAT, '||
  'dim_O integer, own integer, isRel integer, CharGr integer, gr integer, grITem integer, GrElItem integer, Period integer, '||
  'Kind integer, dimKind integer, item_0 integer default 0 not null, item_1 integer default 0 not null)' ; 
  execute immediate sqltable;
  
  i:=2;
  open crsCube;
  fetch crscube into crsCubeList;
  open crsdim_m;
  loop
    fetch crsdim_m into crsdim_mList;
    exit when crsdim_m%notfound;
    sqltable:='alter table '||cubetable||' add Item_'||to_char(i)||' integer';
    i:=i+1;
    execute immediate sqltable;
  end loop;
  close crsdim_m;
  open crsdim_m;
  sqldofrom:=' insert into '||cubetable||'(id, dim_o, own, isRel, Item_0, period, Kind, dimKind, Item_1';
  sqlsFrom:=' from (select * from ObjDimens where itemdimens in 
            (select id from Itemdimens where dimens='||to_char(crsCubeList.Dimens_o)||')) o,
            (select * from (select pr.id, pr.name, pr.kind, idim.kind as kind2, idim.dimKind, idim.id as iddim, pr.dend 
            from ItemDimens idim
            left join paramdimens pd on pd.itemdimens=idim.id
            left join Detparamdimens dpd on dpd.paramdimens=pd.id
            inner join vwPeriod pr on pr.Kind=idim.Kind 
            and f_sovpper(dpd.issovp, pr.dbeg,nvl(dpd.dbeg, to_date('||'''01.01.1900'''||','||'''dd.mm.yyyy'''||')),1)=1
            and f_sovpper(dpd.issovp, pr.dend,nvl(dpd.dend, to_date('||'''31.12.3333'''||','||'''dd.mm.yyyy'''||')),0)=1
            where idim.Dimens='||to_char(crsCubeList.Dimens_p)||' and pr.id in ('||f_CubePerList(crsCubeList.Dimens_p)||'))
            order by dend) p'; 
  k:=1;
  loop 
    k:=k+1;
    fetch crsdim_m into crsdim_mList;
    exit when k=i;
    sqldofrom:=sqldofrom||', item_'||to_char(k);
      sqlsFrom:=sqlsFrom||', (select id from ItemProCubeMeter where DimensProcubemeter='||to_char(crsdim_mList.Id)||') i'||to_char(k);
  end loop;
  
  sqldofrom:=sqldofrom||') select rownum as id, o.id as Dim_O, o.own as Own, o.isRel, o.Keyid as item_0, p.id as Period, p.Kind, p.dimKind, p.id as Item_1';

  k:=1;
  loop 
    k:=k+1;
    exit when k=i;
    sqldofrom:=sqldofrom||', i'||to_char(k)||'.id as item_'||to_char(k); 
  end loop;
  sqltable:=sqldofrom||sqlsFrom;
  execute immediate sqldofrom||sqlsFrom;
  commit;
  
  sqldofrom:='c.item_2'; 
  k:=2;
  loop 
    k:=k+1;
    exit when k=i;
    sqldofrom:=sqldofrom||', c.item_'||to_char(k);
  end loop;
  sqlsFrom:='update '||cubetable||' c set c.';
  sqlsFrom2:='from Datafprocubemeter dfpmt where procubeMeter='||
  to_char(crsCubeList.Procubemeter)||' and 
  (select Count(id) from FactFProCubeMeter where DataFProcubeMeter=dfpmt.id and Itemprocubemeter in (';
  sqlsFrom2:=sqlsFrom2||sqldofrom||'))='||to_char(i-2)||')';

-- заполнение полей: группа измерителей, измерители в группе,показатели в группе
  sqltable:= 'update '||cubetable||' c set (c.gr, c.gritem, c.grelitem) =(select GrMeter, GrMeterItem, Grmeterrateitem '
  ||sqlsfrom2||' where c.id<>0';
  execute immediate sqltable;
  commit;

-- заполнение поля: характеристическая группа
  sqltable:=sqlsFrom||'CharGr =(select case when c.isrel=0 then Chargrmetertyp else CharGrMeterRel end as gr 
                       from Assigngrmetercube where stdcubemeter='||to_char(idCube)||' and grMeter=c.gr
                        and Class1 in (select case when c.isrel=0 then o.class else o1.class end as cl1 from  ObjDimens od 
                        left join obj o on o.id=od.own
                        left join ObjRel obr on obr.id=od.own
                        left join Obj o1 on o1.id=obr.obj1
                        where  od.id=c.dim_o)
                        and class2 in (select case when c.isrel=0 then 0 else o2.class end as cl2 from  ObjDimens od 
                        left join ObjRel obr on obr.id=od.own
                        left join Obj o2 on o2.id=obr.obj2
                        where  od.id=c.dim_o)
                        and itemDimens in (select itemDimens from ObjDimens where id=c.dim_o)
                       ) where c.gr is not null';
  execute immediate sqltable;
  commit;

-- заполнение данными
  sqltable:=' create or replace view vw'||cubetable||' as
         select dmt.id, dmt.own, 0 as isRel, dmt.CharGrMeterTyp as CharGr,
         dmt.GrMeterItem as GrItem,
         dmt.GrMeterRateItem as GrElItem, dmt.Period, (dmt.Value/ms.Kfc) as Value
         from DataMeterTyp dmt
         left join GrMeterItem gmi on gmi.id=dmt.GrMeterItem
         left join Measure ms on ms.id=gmi.Measure
         where Own in (select Own From ObjDimens where IsRel=0 and Itemdimens in
         (select id from ItemDimens where Dimens='||to_char(crsCubeList.Dimens_o)||'))
         and GrMeterItem in (select GrMeterItem from Datafprocubemeter where Procubemeter='||to_char(crsCubeList.Procubemeter)||')
         and (GrMeterRateItem=0 or Grmeterrateitem in (select GrMeterRateItem from Datafprocubemeter where Procubemeter='||to_char(crsCubeList.Procubemeter)||'))
         and dmt.Chargrmetertyp in (select Chargrmetertyp from Assigngrmetercube where Stdcubemeter='||to_char(crsCubeList.Id)||' and Chargrmeterrel=0)
         and isClass=0 and dmt.id<>0
union
select dmt.id, dmt.own, 1 as isRel, dmt.CharGrMeterRel as CharGr,
         dmt.GrMeterItem as GrItem,
         dmt.GrMeterRateItem as GrElItem, dmt.Period, (dmt.Value/ms.Kfc) as Value
         from DataMeterRel dmt
         left join GrMeterItem gmi on gmi.id=dmt.GrMeterItem
         left join Measure ms on ms.id=gmi.Measure
         where Own in (select Own From ObjDimens where IsRel=1 and Itemdimens in
         (select id from ItemDimens where Dimens='||to_char(crsCubeList.Dimens_o)||'))
         and GrMeterItem in (select GrMeterItem from Datafprocubemeter where Procubemeter='||to_char(crsCubeList.Procubemeter)||')
         and (GrMeterRateItem=0 or Grmeterrateitem in (select GrMeterRateItem from Datafprocubemeter where Procubemeter='||to_char(crsCubeList.Procubemeter)||'))
         and dmt.ChargrmeterRel in (select ChargrmeterRel from Assigngrmetercube where Stdcubemeter='||to_char(crsCubeList.Id)||' and ChargrmeterTyp=0)
         and isTypRel=0 and dmt.id<>0';
  execute immediate sqltable;
  
  sqltable:='update '||cubetable||' c set(c.iddata, c.measurefict) =(select id, val from vwDataMeter where own=c.own and isRel=c.isrel 
                       and CharGr=c.chargr and gritem=c.gritem and grelitem=c.grelitem and period=c.period) 
                       where exists (select id from vw'||cubetable||' where own=c.own and isRel=c.isrel 
                       and CharGr=c.chargr and gritem=c.gritem 
                       and grelitem=c.grelitem and period=c.period)';
  execute immediate sqltable;
  commit;
  
  execute immediate 'drop view vw'||cubetable;

  close crsdim_m;
  close crsCube;
end sp_createCubeMeter; 
9 сен 11, 11:00    [11252263]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Glory
Member

Откуда:
Сообщений: 104751
И какой вопрос то ?
9 сен 11, 11:06    [11252306]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Александр Спелицин
Member

Откуда: Из ближайшего подмосковья.
Сообщений: 2517
Сразу вопрос: Сколько денег?
9 сен 11, 11:09    [11252335]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
create or replace function f_CubePerList(idDim in integer) 

в MsSql 2005 строки create or replace нет.
Можно только так:
CREATE FUNCTION [dbo].f_CubePerList(@idDim  INT)
или
ALTER FUNCTION [dbo].f_CubePerList(@idDim  INT)

Начало такое
CREATE FUNCTION [dbo].f_CubePerList(@idDim  INT)
RETURNS VARCHAR(4000)
AS
BEGIN
		SET @idDim =@idDim +1
		/* разные действия */
		
 RETURN convert(varchar,@idDim)		
END

Результат посмотреть так
select dbo.f_CubePerList(4)	
9 сен 11, 11:28    [11252503]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Спасибо trew .
Попробую написать. Синтаксис то одинаковый должен быть ))
9 сен 11, 12:47    [11253197]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

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

Можно еще вопрос?
CREATE FUNCTION f_CubePerList(@idData INT)
RETURNS INT AS
BEGIN
	DECLARE [u][SIZE=3]@KindPer[/SIZE][/u] INT
	DECLARE PrevPeriod CURSOR READ_ONLY FAST_FORWARD FOR
		(SELECT id,kind,PeriodKindList,dbeg,dend FROM Period WHERE kind=[SIZE=3][u]@KindPer[/u][/SIZE] AND id IN
			(SELECT Period FROM Datametertyp WHERE id=@idData))
				DECLARE @perId INT
				DECLARE @perKind INT
				DECLARE @perPeriodKindList INT
				DECLARE @perDBeg DATETIME
				DECLARE @perDEnd DATETIME
Так он эту переменную @KindPer, в курсоре не видит. как с этим быть?
12 сен 11, 11:19    [11262697]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Apikaster
Так он эту переменную @KindPer, в курсоре не видит. как с этим быть?
С чего вы взяли, что не видит? Выводит ошибку "не вижу"?
12 сен 11, 11:49    [11262876]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
trew
Member

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

Пример курсора
DECLARE @dis_ID varchar(255)
DECLARE @dis_value varchar(255)
-- ====================================
DECLARE AttrCursor CURSOR READ_ONLY
FOR
SELECT id, date1 FROM af

OPEN AttrCursor

FETCH NEXT FROM AttrCursor INTO @dis_ID, @dis_value
WHILE (@@fetch_status =0)
BEGIN
SELECT @dis_ID, @dis_value
/* разные действия */

FETCH NEXT FROM AttrCursor INTO @dis_ID, @dis_value
END

CLOSE AttrCursor
DEALLOCATE AttrCursor

adbeg:=to_date('01.01.1900','dd.mm.yyyy');
adend:=to_date('31.12.3333','dd.mm.yyyy');

будет так
DECLARE @datebegin SMALLDATETIME
DECLARE @dateend SMALLDATETIME

SET @datebegin ='19000101'
SET @dateend ='20500101'
  
/* просмотр результата */
SELECT @datebegin, @dateend

/* Конкатенация */
SELECT 'Пример' + ' ' + 'склеивания строки т.е. конкатенация.'

/* выполнить запрос */
DECLARE @sql VARCHAR(3000)
SET @sql ='insert into af (qty) values(3)'
--print @SQL
  exec (@SQL)

/* Записать результат в переменную */
declare @sql nvarchar(100)
declare @x3 varchar(500)

set @sql = N'set @x3= ''12312'''
exec sp_executesql @sql, N'@x3 VarChar(500) output', @x3 output

select @x3
12 сен 11, 11:52    [11262892]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
SSMA for Oracle

http://www.microsoft.com/sqlserver/en/us/product-info/migration-tool.aspx#oracle
12 сен 11, 12:26    [11263178]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
СПС вам. Просто у меня сет в переменную выполнялся после того как курсор был создан и он у меня просто выявлял нулл.
13 сен 11, 13:05    [11268776]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
trew,
еще возник вопросик.
в оракле я отрывал бегин для
15 сен 11, 16:23    [11282429]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Apikaster,
begin
  select table_name into cubetable from all_tables where Owner=user and table_name='CUBEM_'||to_char(idcube);
  
  if ((cubetable is not null) and (isExists=0)) then
    return;
  end if;
  
  execute immediate 'drop table '||cubetable;
  exception
    when no_data_found then
    cubetable:='CUBEM_'||to_char(idcube);
  end;

и тут в if ((cubetable is not null) and (isExists=0)) then то выходил из процедуры.
но когда в mssql я пишу exit он выдает ошибку.
что то надо дописывать?
и кстати. в оракле открывал внутри бегина бегин по скольку так приняло для execute immediate. а как быть в mssql ?
15 сен 11, 16:26    [11282452]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
begin
  select table_name into cubetable from all_tables where Owner=user and table_name='CUBEM_'||to_char(idcube);
  
  if ((cubetable is not null) and (isExists=0)) then
    return;
  end if;
  
  execute immediate 'drop table '||cubetable;
  exception
    when no_data_found then
    cubetable:='CUBEM_'||to_char(idcube);
  end;

SELECT * FROM INFORMATION_SCHEMA.TABLE where TABLE_NAME='CUBEM_'+CAST(@idCube AS VARCHAR(MAX))
и как определить базу? мне нужно чтобы как в орекле. Owner=user и он ищет таблицы только текущего пользователя. В моем случае базы. Но мне не надо чтобы он был привязан к определенной базе. Или он сам по умолчанию берет ту базу которая у меня в параметрах передается? с Явы?
15 сен 11, 16:32    [11282492]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
trew
Member

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

Пользователя и базу можно посмотреть так
SELECT suser_sname()
SELECT DB_NAME()
15 сен 11, 17:25    [11282852]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
trew
Member

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

Удалить все таблицы с именами по маске
DECLARE @sql VARCHAR(MAX) ,
    @tablename VARCHAR(MAX)

DECLARE droptable CURSOR FOR 
SELECT name
FROM sys.tables 
WHERE type='U' AND name LIKE '%123%'
OPEN droptable
FETCH NEXT FROM droptable 
INTO @tablename
WHILE @@FETCH_STATUS = 0 
    BEGIN
        SET @sql = 'drop table [' + @tablename + ']'
        PRINT @sql
        EXEC (@sql)
        FETCH NEXT
   FROM droptable
   INTO @tablename
    END

CLOSE droptable
DEALLOCATE droptable
8516168
15 сен 11, 17:41    [11282990]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
trew
Member

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

Возможно, нужно использовать временные таблицы.
create table #tmp(i int)

они создаются в базе tempdb. Проверка существования таблицы:
if OBJECT_ID('tempdb..#tmp') is null

Или для Вашей задачи подойдет не убивание таблицы, а затирание данных
 truncate table #tmp
15 сен 11, 18:00    [11283181]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
trew,
Спасибо. Я уже почти все закончил. Благодаря вам))
Но возник еще вопрос. Я не нашел как указать удаление какого то символа последнего.
Не могли бы вы подсказать как это сделать?
В орекле есть функция RTRIM('какое то слово, какое то слово, какое что слово,',',')
Ей передается 2 параметра, стринг какой то и что с конца убрать. В моем случае запятую я указываю.
И результат приходит как = 'какое то слово, какое то слово, какое что слово', без последней запятой.
А как это сделать в mssql? Может есть какая то функция?
16 сен 11, 12:17    [11286595]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
trew
Member

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

DECLARE @str VARCHAR(30)
SET @str ='удалить последний символ'

SELECT SUBSTRING(@str,1,LEN(@str)-1)

Не понял зачем таблицы в базе удалять? Ведь для них создаются индексы, а также ведется статистика - для повышения быстродействия запросов.
16 сен 11, 12:57    [11287016]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
trew
Member

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

Если нужно один символ заменит на другой (заменит запятую на пустое место)
SELECT REPLACE(@str,',','')
16 сен 11, 13:01    [11287056]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
trew,
Просто удалить быстрее. чем заново все переписывать ))
У оракла по крайней мере. Дропнуть таблицу а после пересоздать и залить быстрее чем пробегаться и проверять все данные на совпадение ))
OPEN crsassDimP
			FETCH NEXT FROM crsassDimP INTO @crsassDimPId,@crsassDimPParamDimens,@crsassDimPGrAttribItem,@crsassDimPGrFactorItem,
			@crsassDimPGrMeterRateItem,@crsassDimPGrNomenNodeItem,@crsassDimPElementMeterItem,@crsassDimPGrQualityPropItem,
			@crsassDimPDtUpd,@crsassDimPDbeg,@crsassDimPDend,@crsassDimPIsSovp
			SET @aDbeg = @crsassDimPDbeg
			SET @aDend = @crsassDimPDend
			IF @crsassDimPIsSovp=0
			BEGIN
				WHILE @@fetch_status=0
				BEGIN
					DECLARE crsp CURSOR READ_ONLY FAST_FORWARD FOR
						(SELECT id,kind,PeriodKindList,dbeg,dend FROM vwPeriod WHERE kind=@crsdim_pKind AND dbeg>=@crsassDimPDbeg AND dend<=@crsassDimPDend)
					OPEN crsp
						FETCH NEXT FROM crsp INTO @crspId,@crspKind,@crspPeriodKindList,@crspDbeg,@crspDend
						IF @@fetch_status=0
							SET @plist=@plist+CAST(@crspId AS VARCHAR(MAX))+','
					CLOSE crsp
					DEALLOCATE crsp
				END
			END
			ELSE
			BEGIN
				WHILE @@fetch_status=0
				BEGIN
					DECLARE crspSovp CURSOR READ_ONLY FAST_FORWARD FOR
						(SELECT id,kind,PeriodKindList,dbeg,dend FROM vwPeriod WHERE kind=@crsdim_pKind AND dbeg=@crsassDimPDbeg AND dend=@crsassDimPDend)
					OPEN crspSovp
						FETCH NEXT FROM crspSovp INTO @crspSovpId,@crspSovpKind,@crspSovpPeriodKindList,@crspSovpDbeg,@crspSovpDend
						IF @@fetch_status=0
							SET @plist=@plist+CAST(@crspSovpId AS VARCHAR(MAX))+','
					CLOSE crspSovp
					DEALLOCATE crspSovp
				END
			END
			SET @i = @i+1
		CLOSE crsassDimP
		DEALLOCATE crsassDimP
Где я тут допустил ошибку ? у меня цикл не завершается ))
В @plist он должен записывать данные пока не закончиться курсор.
16 сен 11, 13:01    [11287058]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Glory
Member

Откуда:
Сообщений: 104751
У вас вложенный курсор для выбора одной записи что ли ?
По-моему весь ваш скрипт соответствует одному нормальному запросу
16 сен 11, 13:08    [11287114]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
каждый раз передается новый айдишник, по которому он и бегает, и в переменную записывает через запятую значения определенного поля. Значений может быть хоть сколько, от одного, до сотен. В этом вся проблемка, у меня она не записываетя ))
16 сен 11, 13:14    [11287185]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Glory,
каждый раз передается новый айдишник, по которому он и бегает, и в переменную записывает через запятую значения определенного поля. Значений может быть хоть сколько, от одного, до сотен. В этом вся проблемка, у меня она не записываетя ))

И как же вложенный запрос обработает "от одного до сотен значений", если сразу после попытки выборки первого значения идет удаление курсора ?

У меня такое чуаство, что вы пытаетесь код Оракла реализовать на MSSQL один в один
16 сен 11, 13:17    [11287216]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
Да )) Но я не понимаю до конца как это правильно сделать.
open crsassDimP;
    loop
      fetch crsassDimP into crsassDimP_List;
      exit when crsassDimP%notfound;
      adbeg:=crsassDimP_List.Dbeg;
      adend:=crsassDimP_List.Dend;
      if crsassDimP_List.Issovp=0 then
        open crsp;
        loop
          fetch crsp into crsp_list;
          exit when crsp%notfound;
          plist:=plist||to_char(crsp_List.Id)||',';
        end loop;
        close crsp;
      else
        open crspSovp;
        loop
          fetch crspSovp into crspSovp_list;
          exit when crspSovp%notfound;
          plist:=plist||to_char(crspSovp_List.Id)||',';
        end loop;
        close crspSovp;
      end if;
      i:=i+1;
    end loop;
    if i=0 then
      open crspAll;
      loop
        fetch crspAll into crspAll_list;
        exit when crspAll%notfound;
        plist:=plist||to_char(crspAll_List.Id)||',';
        
      end loop;
      close crspAll;
    end if;
    close crsassDimP;
просто у меня есть функция на оракле )) и мне ее нужно переписать на mssql , хотя не знаю как ))
Но пытаюсь и учусь ))
16 сен 11, 13:22    [11287271]     Ответить | Цитировать Сообщить модератору
 Re: Oracle & MsSql 2005 транслейт  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Glory,
Да )) Но я не понимаю до конца как это правильно сделать.

Ну так опубликуйте задание, а не ваш способ его решения
16 сен 11, 13:23    [11287286]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить