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

Откуда:
Сообщений: 45
skyANA, Таблица на четверть полная, из 1с я обрабатывал эти запросы но вся проблема состоит в том что это очень долго вот и сказали перейти непосредственно в mssql
29 сен 14, 19:57    [16635838]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
lcanl, Сейчас попытаюсь объяснить:
Функция ПолучитьАдрФИАС(aoid)
ун_код = aoid;
Если ПустаяСтрока(ун_код) Тогда
    Возврат "";
КонецЕсли;    
ConnectionRAR = Новый COMОбъект("ADODB.Connection"); 
ConnectionRAR.Open
Str = Новый COMОбъект("ADODB.RecordSet");
Str.Open("SELECT * FROM FIAS_ADDROBJ WHERE AOID = '" + ун_код + "'",ConnectionRAR);  
стр_возвр = "";
Пока Str.EOF() = 0 Цикл 
    стр_возвр = "" + УбратьКав(Str.Fields("FORMALNAME").Value) + " " + Str.Fields("SHORTNAME").Value;
    родитель = Str.Fields("PARENTGUID").Value;
    Str.MoveNext(); 
КонецЦикла; 

Для иии = 1 По 7 Цикл 
    Если родитель = """" + """" Тогда
        Возврат стр_возвр;
        Прервать;
    КонецЕсли;
    Str = Новый COMОбъект("ADODB.RecordSet");
    Str.Open("SELECT * FROM FIAS_ADDROBJ WHERE AOGUID = '" + родитель + "' AND ACTSTATUS = 1",ConnectionRAR);  
    Пока Str.EOF() = 0 Цикл 
         стр_возвр= "" + УбратьКав(Str.Fields("FORMALNAME").Value) + " " + Str.Fields("SHORTNAME").Value + " " + стр_возвр;
        родитель = Str.Fields("PARENTGUID").Value;
        Str.MoveNext(); 
    КонецЦикла; 
КонецЦикла; 
ConnectionRAR.Close();
Возврат стр_возвр;

КонецФункции


Процедура ПроставитьАдресаФИАС(Элемент)
ConnectionRAR1 = Новый COMОбъект("ADODB.Connection"); 
ConnectionRAR1.Open
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = ConnectionRAR1;
Для каждого стр Из ТаблицаПартий3 Цикл 
    Если (НЕ ПустаяСтрока(стр.aoid)) И ПустаяСтрока(стр.fias_name) Тогда
        Сообщить("!!!!!!!!!!    " + стр.rtt_addr);    
        адр_фиас = ПолучитьАдрФИАС(стр.aoid);
        Command.CommandText =  "USE licenses; UPD ATE RTT_net SET fias_name = '" + адр_фиас + "' WH ERE id = " + УбратьПробелы(Строка(стр.id));
        Command.Execute();
    КонецЕсли;
КонецЦикла; 
ConnectionRAR1.Close();
КонецПроцедуры



Отсюда видимо что 5 это FORMALNAME SHORTNAME PARENTGUID AOID и AOGUID
29 сен 14, 20:03    [16635862]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
skyANA, из ТСа долго выковыривать http://wiki.gis-lab.info/w/ФИАС#ADDROBJ
но imho все это бессмысленно, пока он не прочитает хоть что-то по SQL
29 сен 14, 20:09    [16635886]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
lcanl
Процедура ПроставитьАдресаФИАС(Элемент)
ConnectionRAR1 = Новый COMОбъект("ADODB.Connection"); 
ConnectionRAR1.Open
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = ConnectionRAR1;
>>>Для каждого стр Из ТаблицаПартий3 Цикл 
    Если (НЕ ПустаяСтрока(стр.aoid)) И ПустаяСтрока(стр.fias_name) Тогда
        Сообщить("!!!!!!!!!!    " + стр.rtt_addr);    
        адр_фиас = ПолучитьАдрФИАС(стр.aoid);
        Command.CommandText =  "USE licenses; UPD ATE RTT_net SET fias_name = '" + адр_фиас + "' WH ERE id = " + УбратьПробелы(Строка(стр.id));
        Command.Execute();
    КонецЕсли;
КонецЦикла;<<< 
ConnectionRAR1.Close();
КонецПроцедуры
О! Есть некая ТаблицаПартий, что хранит aoid (идентификатор адресного объекта) и ещё какой-то идентифкатор (стр.id).

И походу задача состоит в том, чтобы в ТаблицуПартий занести данные адресного объекта, соответсвующие стр.aoid, из ФИАС в виде строки.
29 сен 14, 20:17    [16635934]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
skyANA, Да, только в этом случае таблицапартий это rtt_net и колонка fias_name
29 сен 14, 20:23    [16635955]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
skyANA,
Я так понимаю что на этом примере:
-- сбор всех parentguid
WITH all_parents AS (
SELECT DISTINCT parentguid
FROM addrobj
WHERE (currstatus = 0) AND (parentguid IS NOT NULL)
)
-- выбор элементов самого нижнего уровня (не входящих в список all_parents)
-- и получение полного адреса
SELECT (make_full(aoid)).*
FROM addrobj
WHERE (currstatus = 0) AND (aoguid NOT IN (SELECT parentguid FROM all_parents))

Можно разложить древо и потом результат записать в колонку?
29 сен 14, 20:43    [16636002]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
lcanl, Вы запросы-то умеете выполнять в SQL Management Studio?
29 сен 14, 21:03    [16636068]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
skyANA, Выполнять умею писать не очень)
29 сен 14, 21:14    [16636108]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
Вообщем получилось вот такое:
create proc ID2Fias
@id int
as
declare
@str   varchar(2048),
@aoid  varchar(2048),
@parentid varchar(2048),
@i int

select @aoid = AOID
from rtt_net7
where id = @id

SELECT 
  @str = FORMALNAME + ' '+ SHORTNAME, -- Кавычки
  @parentid = PARENTGUID 
FROM FIAS_ADDROBJ 
WHERE AOID = @aoid 

select @i = 0

while @i < 7
begin
if not isnull(@parentid,'""') = '""'
    select 
	   @str = FORMALNAME + ' '+ SHORTNAME + ' '+ @str,
	   @parentid = PARENTGUID 
	   from FIAS_ADDROBJ WHERE AOGUID = @parentid AND ACTSTATUS = 1   
select @i = @i + 1
end

select @str

update rtt_net7 
set fias_name = @str
where id = @id


go


Вопрос: Как это все сделать в "цикле" используя FETCH и CURSORS
30 сен 14, 13:18    [16638232]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Maxx
Member [скрыт]

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

зачем вам курсор ? Туту по виду и цикл то не нужен в чистом виде..будет достаточно сте-шки +апдейт
30 сен 14, 13:20    [16638248]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
lcanl, вы открывали ссылку про ФИАС из моего прошлого комментария? там есть запросы без всяких курсоров
30 сен 14, 13:25    [16638282]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
Maxx, Да вот сказали сделать так, скажите еще пожалуйста в версии mssql возможно сделать рекурсивный запрос?
И если есть все таки пример по фетчу и курсорам можете скинуть или натолкнуть как сделать?
30 сен 14, 13:26    [16638300]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
Shakill, Она у меня открыта, но мне сказали что рекурсивов нет в mssql)
30 сен 14, 13:27    [16638307]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
lcanl
Maxx, Да вот сказали сделать так, скажите еще пожалуйста в версии mssql возможно сделать рекурсивный запрос?

http://msdn.microsoft.com/en-us/library/ms175972.aspx
Пример D
30 сен 14, 13:29    [16638325]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
lcanl
Shakill, Она у меня открыта, но мне сказали что рекурсивов нет в mssql)

select @@VERSION покажите
30 сен 14, 13:30    [16638328]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
_djХомяГ
Guest
Если это правда
автор
Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
Feb 20 2014 20:04:26
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

То Вас дезинформируют
30 сен 14, 13:30    [16638329]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
_djХомяГ, Это так, читал что действительно рекурсивные запросы есть. Но сказали делать так. Вот пытаюсь сделать.
30 сен 14, 13:33    [16638354]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
Maxx, Это я понял) это рекурсивный запрос, а есть примеры использования процедуры в fetch и cursor?
30 сен 14, 13:40    [16638411]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
lcanl
цедуры в fetch и cursor?

есть..но в данном случае - ето путь в никуда вообще
30 сен 14, 13:44    [16638439]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
lcanl
Maxx, Это я понял) это рекурсивный запрос, а есть примеры использования процедуры в fetch и cursor?
забудьте про курсоры пока не освоите написание запросов
30 сен 14, 13:46    [16638447]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
Shakill,Потихоньку осваиваю все таки к чему то пришел за ночь, теперь нужно как раз освоить как работать с курсорами на примере процедуры которую я написал)
30 сен 14, 13:48    [16638458]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
lcanl
Shakill,Потихоньку осваиваю все таки к чему то пришел за ночь, теперь нужно как раз освоить как работать с курсорами на примере процедуры которую я написал)
не нужны тут курсоры, вас обманули
30 сен 14, 13:52    [16638490]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
iap
Member

Откуда: Москва
Сообщений: 47065
Курсоры любят ораклоиды.
Тут их не очень-то любят.
30 сен 14, 13:54    [16638495]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
Shakill,Вот я нашел такой пример:
CREATE TABLE #TMP
(
   ii int
)
GO

INSERT INTO #TMP(ii) VALUES(1)
INSERT INTO #TMP(ii) VALUES(2)
INSERT INTO #TMP(ii) VALUES(3)

GO

--Create a cursor.
DECLARE cur CURSOR
FOR SELECT * FROM #TMP

--Display the status of the cursor before and after opening
--closing the cursor.

SELECT CURSOR_STATUS('global','cur') AS 'After declare'
OPEN cur
SELECT CURSOR_STATUS('global','cur') AS 'After Open'
CLOSE cur
SELECT CURSOR_STATUS('global','cur') AS 'After Close'

--Remove the cursor.
DEALLOCATE cur

--Drop the table.
DROP TABLE #TMP


Как сюда грубо говоря вставить процедуру? Извиняюсь если не правильно написал.

Да я бы с радостью от них отказался но сказали сделать что тут поделаешь.
30 сен 14, 13:55    [16638503]     Ответить | Цитировать Сообщить модератору
 Re: Процедура  [new]
lcanl
Member

Откуда:
Сообщений: 45
lcanl, Вот этот вариант вроде лучше:
CREATE PROCEDURE [dbo].[sp_UpdateCouponCount]
AS

Declare     @couponCount int,
            @CouponName nvarchar(50),
            @couponIdFromQuery int


Declare curP cursor For

  select COUNT(*) as totalcount , Name as name,couponuse.couponid  as couponid from Coupon as coupon 
  join CouponUse as couponuse on coupon.id = couponuse.couponid
  where couponuse.id=@cuponId
  group by couponuse.couponid , coupon.Name

OPEN curP 
Fetch Next From curP Into @couponCount, @CouponName,@couponIdFromQuery

While @@Fetch_Status = 0 Begin

    print @couponCount
    print @CouponName

    update Coupon SET NoofUses=@couponCount
    where couponuse.id=@couponIdFromQuery


Fetch Next From curP Into @couponCount, @CouponName,@couponIdFromQuery

End -- End of Fetch

Close curP
Deallocate curP


Тут код процедуры нормально должен встать?
30 сен 14, 13:59    [16638543]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить