Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как с помощью 1с++ выполнить неск. SQL инструкций (число прочтений - 13719 )
Vitek77
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 44
Зарегистрирован: 22. Сентября 2006
Как с помощью 1с++ выполнить неск. SQL инструкций
28. Сентября 2006 :: 12:36
Печать  
По мотивам ветки: http://www.1cpp.ru/forum/YaBB.pl?num=1150905518
Как с помощью комманд 1с++ выполнить несколько инструкций SQL и получить результат последней?

DECLARE @GrpTbl TABLE(id char(9), isfolder tinyint)
INSERT INTO @GrpTbl(id, isfolder) VALUES ('     0   ', 1)
WHILE @@rowcount > 0 BEGIN
INSERT INTO @GrpTbl (id, isfolder)
SELECT
 SC.id as id,
 SC.isfolder as isfolder
FROM SC12 as SC (NOLOCK)
WHERE (SC.isfolder = 1) AND
           (SC.parentid IN (SELECT T.id FROM @GrpTbl as T))
           AND (SC.id NOT IN (SELECT TT.id FROM @GrpTbl as TT))
END

SELECT
 T.id, T.isfolder, SC.descr
FROM @GrpTbl as T
INNER JOIN SC12 as SC (NOLOCK) ON SC.id = T.id

Как в ТЗ получить результат последнего селекта?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #1 - 28. Сентября 2006 :: 12:57
Печать  
Код
Выбрать все
select id, isfolder, descr
from sc12 (nolock)
where isfolder=1 


Результат тот же.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Vitek77
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 44
Зарегистрирован: 22. Сентября 2006
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #2 - 28. Сентября 2006 :: 13:05
Печать  
berezdetsky писал(а) 28. Сентября 2006 :: 12:57:
Код
Выбрать все
select id, isfolder, descr
from sc12 (nolock)
where isfolder=1 


Результат тот же.


В этом случае он мне вывалит все папки, а мне нужны только подпапки из выбранной папки.
Например когда INSERT INTO @GrpTbl(id, isfolder) VALUES ('   YIC   ', 1)
  
Наверх
 
IP записан
 
Vitek77
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 44
Зарегистрирован: 22. Сентября 2006
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #3 - 28. Сентября 2006 :: 13:06
Печать  
berezdetsky писал(а) 28. Сентября 2006 :: 12:57:
Код
Выбрать все
select id, isfolder, descr
from sc12 (nolock)
where isfolder=1 


Результат тот же.


В этом случае он мне вывалит все папки, а мне нужны только подпапки из выбранной папки.
Например когда INSERT INTO @GrpTbl(id, isfolder) VALUES ('   YIC   ', 1)
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #4 - 28. Сентября 2006 :: 13:33
Печать  
Надо отменить получение с сервера результатов DML операций, тех что идут перед селектом.
Для этого в начало запроса вставить: set nocount on
Т.о. первый результат полученный с сервера будет результат первой в батче инструкции селект.

Эта установка на сессию, поэтому для порядку, после выполнения запроса нужно включить обратно: set nocount off.
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #5 - 28. Сентября 2006 :: 13:36
Печать  
Vitek77 писал(а) 28. Сентября 2006 :: 13:06:
В этом случае он мне вывалит все папки, а мне нужны только подпапки из выбранной папки.
Например когда INSERT INTO @GrpTbl(id, isfolder) VALUES ('   YIC   ', 1)

В исходном вопросе стояло '     0   '.
При новой постановке: используй ХП или функцию. Или две инструкции + временная таблица.
DmitrO - the best  Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Vitek77
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 44
Зарегистрирован: 22. Сентября 2006
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #6 - 28. Сентября 2006 :: 13:57
Печать  
DmitrO писал(а) 28. Сентября 2006 :: 13:33:
Надо отменить получение с сервера результатов DML операций, тех что идут перед селектом.
Для этого в начало запроса вставить: set nocount on
Т.о. первый результат полученный с сервера будет результат первой в батче инструкции селект.

Эта установка на сессию, поэтому для порядку, после выполнения запроса нужно включить обратно: set nocount off.


Если я правильно понял, то должно получиться:

Код
Выбрать все
SET NOCOUNT ON
DECLARE @GrpTbl TABLE(id char(9), isfolder tinyint)
INSERT INTO @GrpTbl(id, isfolder) VALUES ('   YIC   ', 1)
WHILE @@rowcount > 0 BEGIN
  INSERT INTO @GrpTbl (id, isfolder)
  SELECT
    SC.id as id,
    SC.isfolder as isfolder
  FROM
    sc33 as SC (NOLOCK)
  WHERE
    (SC.isfolder = 1) AND
    (SC.parentid IN (SELECT T.id FROM @GrpTbl as T)) AND
    (SC.id NOT IN (SELECT TT.id FROM @GrpTbl as TT))
END
SET NOCOUNT OFF
SELECT
  T.id, T.isfolder, SC.descr
FROM @GrpTbl as T
INNER JOIN sc33 as SC (NOLOCK) ON SC.id = T.id 



но так мне тоже возвращается пустая ТЗ Печаль
  
Наверх
 
IP записан
 
Vitek77
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 44
Зарегистрирован: 22. Сентября 2006
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #7 - 28. Сентября 2006 :: 14:06
Печать  
Сори. Нужно убегать. Продолжу завтра.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #8 - 28. Сентября 2006 :: 15:28
Печать  
рекомендую только в объявлении таблицы добавить:
Код
Выбрать все
DECLARE @GrpTbl TABLE(id char(9), isfolder tinyint primary key clustered (id)) 



PS: Эх 9-й бы сервачоГ, рекурсивный бы замутили.. ваще-бы тогда был один селект.. Круглые глаза
« Последняя редакция: 28. Сентября 2006 :: 18:59 - DmitrO »  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #9 - 28. Сентября 2006 :: 15:50
Печать  
Еще одно наблюдение, поле isfolder в @GrpTbl вроде бы и не нужно..
  
Наверх
ICQ  
IP записан
 
Vitek77
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 44
Зарегистрирован: 22. Сентября 2006
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #10 - 29. Сентября 2006 :: 06:58
Печать  
Для эксперимента сделал следующий запрос:
Код
Выбрать все
ТекстЗапроса = "SET NOCOUNT ON
|if exists(select * from tempdb..sysobjects where id = object_id('tempdb..#StatDoc'))
|	  drop table #StatDoc
|create table #StatDoc (IdStat tinyint, isdel tinyint, isprov tinyint)
|INSERT INTO #StatDoc (IdStat, isdel, isprov) VALUES (1, 0, 0)
|INSERT INTO #StatDoc (IdStat, isdel, isprov) VALUES (7, 1, 0)
|INSERT INTO #StatDoc (IdStat, isdel, isprov) VALUES (2, 0, 1)
|select * from #StatDoc
|SET NOCOUNT OFF
|SELECT * from sc33
|drop table #StatDoc	     


В результате в ТЗ вывалился результат первого селекта.
Видимо придется делать так, как предложил berezdetsky
Или надо что-то в консерватории подправить?
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #11 - 29. Сентября 2006 :: 07:04
Печать  
для танкистов:
Т.о. первый результат полученный с сервера будет результат первой в батче инструкции селект.
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #12 - 29. Сентября 2006 :: 07:09
Печать  
в первом запросе первая инструкция селект вот эта:
SELECT
  T.id, T.isfolder, SC.descr
FROM @GrpTbl as T
INNER JOIN sc52 as SC (NOLOCK) ON SC.id = T.id

во втором запросе вот эта:
select * from #StatDoc
  
Наверх
ICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #13 - 29. Сентября 2006 :: 07:14
Печать  
немного тупану... но все же попробую... Vitek77 ты не пробовал
Код
Выбрать все
SET NOCOUNT OFF 

сделать последней строкой твоего запроса? мне внутренний голос подсказывает что именно это DmitrO и приводимые им описания и имеют ввиду...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Vitek77
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 44
Зарегистрирован: 22. Сентября 2006
Re: Как с помощью 1с++ выполнить неск. SQL инструк
Ответ #14 - 29. Сентября 2006 :: 07:17
Печать  
DmitrO писал(а) 29. Сентября 2006 :: 07:09:
в первом запросе первая инструкция селект вот эта:
SELECT
 T.id, T.isfolder, SC.descr
FROM @GrpTbl as T
INNER JOIN sc52 as SC (NOLOCK) ON SC.id = T.id

хм... а мне казалось, что первой инструкцией в первом запросе будет вот эта:
Код
Выбрать все
SELECT
    SC.id as id,
    SC.isfolder as isfolder
  FROM
    sc33 as SC (NOLOCK)
  WHERE
    (SC.isfolder = 1) AND
    (SC.parentid IN (SELECT T.id FROM @GrpTbl as T)) AND
    (SC.id NOT IN (SELECT TT.id FROM @GrpTbl as TT)) 


, а вот эта инструкция
Код
Выбрать все
SELECT
  T.id, T.isfolder, SC.descr
FROM @GrpTbl as T
INNER JOIN sc52 as SC (NOLOCK) ON SC.id = T.id 


будет н-ная по счету

поэтому у меня и возник вопрос - как вернуть результат второй инструкции.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать