Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 [3] 4 вперед Ctrl→ все |
lcanl Member Откуда: Сообщений: 45 |
skyANA, Таблица на четверть полная, из 1с я обрабатывал эти запросы но вся проблема состоит в том что это очень долго вот и сказали перейти непосредственно в mssql |
29 сен 14, 19:57 [16635838] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
skyANA, из ТСа долго выковыривать http://wiki.gis-lab.info/w/ФИАС#ADDROBJ но imho все это бессмысленно, пока он не прочитает хоть что-то по SQL |
29 сен 14, 20:09 [16635886] Ответить | Цитировать Сообщить модератору |
skyANA Member Откуда: Зеленоград Сообщений: 28355 |
И походу задача состоит в том, чтобы в ТаблицуПартий занести данные адресного объекта, соответсвующие стр.aoid, из ФИАС в виде строки. |
||
29 сен 14, 20:17 [16635934] Ответить | Цитировать Сообщить модератору |
lcanl Member Откуда: Сообщений: 45 |
skyANA, Да, только в этом случае таблицапартий это rtt_net и колонка fias_name |
29 сен 14, 20:23 [16635955] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
skyANA Member Откуда: Зеленоград Сообщений: 28355 |
lcanl, Вы запросы-то умеете выполнять в SQL Management Studio? |
29 сен 14, 21:03 [16636068] Ответить | Цитировать Сообщить модератору |
lcanl Member Откуда: Сообщений: 45 |
skyANA, Выполнять умею писать не очень) |
29 сен 14, 21:14 [16636108] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
lcanl, зачем вам курсор ? Туту по виду и цикл то не нужен в чистом виде..будет достаточно сте-шки +апдейт |
30 сен 14, 13:20 [16638248] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
lcanl, вы открывали ссылку про ФИАС из моего прошлого комментария? там есть запросы без всяких курсоров |
30 сен 14, 13:25 [16638282] Ответить | Цитировать Сообщить модератору |
lcanl Member Откуда: Сообщений: 45 |
Maxx, Да вот сказали сделать так, скажите еще пожалуйста в версии mssql возможно сделать рекурсивный запрос? И если есть все таки пример по фетчу и курсорам можете скинуть или натолкнуть как сделать? |
30 сен 14, 13:26 [16638300] Ответить | Цитировать Сообщить модератору |
lcanl Member Откуда: Сообщений: 45 |
Shakill, Она у меня открыта, но мне сказали что рекурсивов нет в mssql) |
30 сен 14, 13:27 [16638307] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
http://msdn.microsoft.com/en-us/library/ms175972.aspx Пример D |
||
30 сен 14, 13:29 [16638325] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
select @@VERSION покажите |
||
30 сен 14, 13:30 [16638328] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
Если это правда
То Вас дезинформируют |
||
30 сен 14, 13:30 [16638329] Ответить | Цитировать Сообщить модератору |
lcanl Member Откуда: Сообщений: 45 |
_djХомяГ, Это так, читал что действительно рекурсивные запросы есть. Но сказали делать так. Вот пытаюсь сделать. |
30 сен 14, 13:33 [16638354] Ответить | Цитировать Сообщить модератору |
lcanl Member Откуда: Сообщений: 45 |
Maxx, Это я понял) это рекурсивный запрос, а есть примеры использования процедуры в fetch и cursor? |
30 сен 14, 13:40 [16638411] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
есть..но в данном случае - ето путь в никуда вообще |
||
30 сен 14, 13:44 [16638439] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
|
||
30 сен 14, 13:46 [16638447] Ответить | Цитировать Сообщить модератору |
lcanl Member Откуда: Сообщений: 45 |
Shakill,Потихоньку осваиваю все таки к чему то пришел за ночь, теперь нужно как раз освоить как работать с курсорами на примере процедуры которую я написал) |
30 сен 14, 13:48 [16638458] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
|
||
30 сен 14, 13:52 [16638490] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47065 |
Курсоры любят ораклоиды. Тут их не очень-то любят. |
30 сен 14, 13:54 [16638495] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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 | ![]() |