Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема GO в запросе. (число прочтений - 3506 )
strady
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 23. Сентября 2013
GO в запросе.
30. Октября 2013 :: 20:41
Печать  
Выполняю код
Код
Выбрать все
			RS = СоздатьОбъект("ODBCRecordset");
			RS.Отладка(1);
			RS.УстБД1С();
			ТекстЗапроса = "
			|IF OBJECT_ID (N'dbo.Уровень_Ном', N'FN') IS NOT NULL
			|   DROP FUNCTION dbo.Уровень_Ном;
			//RS.ВыполнитьИнструкцию(ТекстЗапроса);
			//ТекстЗапроса = "
			|GO
			|CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
			|	RETURNS  Int
			|	BEGIN
			|	 DECLARE @R Char(9)
			|	 DECLARE @Lev Int
			|	 SET @Lev = 0
			|	     SET @R = @IDSpr
			|	     WHILE (@R <> $ПустойИД) AND (@R IS NOT NULL)
			|	     BEGIN
			|	     SELECT
			|	     @R = PARENTID, @Lev = @Lev + 1
			|	     FROM $Справочник."+ЭлементВид+" (nolock)
			|	     WHERE
			|	     (ID = @R)
			|	     END
			|	     RETURN @Lev
			|END;
			|GO
			//RS.ВыполнитьИнструкцию(ТекстЗапроса);
			//ТекстЗапроса = "
			|SELECT dbo.Уровень_Ном(Номенклатура.ID) [Уровень]
			|		   ,Номенклатура.ID [Элемент $Справочник."+ЭлементВид+"]
			|		   ,Номенклатура.ParentID [Родитель $Справочник."+ЭлементВид+"]
			|	     FROM $Справочник."+ЭлементВид+" AS Номенклатура (nolock)  
			|WHERE
			|    Номенклатура.ID = :Товар";

			RS.УстановитьТекстовыйПараметр("Товар", Элемент);
			ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
 



получаю ошибку
Код
Выбрать все
IF OBJECT_ID (N'dbo.Уровень_Ном', N'FN') IS NOT NULL
   DROP FUNCTION dbo.Уровень_Ном;
GO
CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
	RETURNS  Int
	BEGIN
	 DECLARE @R Char(9)
	 DECLARE @Lev Int
	 SET @Lev = 0
	     SET @R = @IDSpr
	     WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
	     BEGIN
	     SELECT
	     @R = PARENTID, @Lev = @Lev + 1
	     FROM sc656 (nolock)
	     WHERE
	     (ID = @R)
	     END
	     RETURN @Lev
END;
GO
SELECT dbo.Уровень_Ном(Номенклатура.ID) [Уровень]
		   ,Номенклатура.ID [Элемент $Справочник.Номенклатура]
		   ,Номенклатура.ParentID [Родитель $Справочник.Номенклатура]
	     FROM sc656 AS Номенклатура (nolock)  
WHERE
    Номенклатура.ID = '  EL1G   '
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);

{\\*****************************.ERT(254)}: State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около конструкции "GO". 



в QA код
Код
Выбрать все
IF OBJECT_ID (N'dbo.Уровень_Ном', N'FN') IS NOT NULL
   DROP FUNCTION dbo.Уровень_Ном;
GO
CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
	RETURNS  Int
	BEGIN
	 DECLARE @R Char(9)
	 DECLARE @Lev Int
	 SET @Lev = 0
	     SET @R = @IDSpr
	     WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
	     BEGIN
	     SELECT
	     @R = PARENTID, @Lev = @Lev + 1
	     FROM sc656 (nolock)
	     WHERE
	     (ID = @R)
	     END
	     RETURN @Lev
END;
GO
SELECT dbo.Уровень_Ном(Номенклатура.ID) [Уровень]
		   ,Номенклатура.ID [Элемент $Справочник.Номенклатура]
		   ,Номенклатура.ParentID [Родитель $Справочник.Номенклатура]
	     FROM sc656 AS Номенклатура (nolock)  
WHERE
    Номенклатура.ID = '  EL1G   ' 


выполняется без ошибок.

С раскомментированными строками ошибки нет, но выполняется слишком долго. Стандартный метод Уровень() быстрее.
Догадываюсь, что "GO" это отдельная фишка, которую нужно прикручивать. Подскажите как. Сапсибо!
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: GO в запросе.
Ответ #1 - 31. Октября 2013 :: 04:32
Печать  
GO - это указание MS Managment Studio об окончании "пакета" запросов
переопределяемое в настройках, кстати

к T-SQL никакого отношения не имеет.

С точки зрения ОДБЦРекордСет - это просто раздельные запросы.
  
Наверх
 
IP записан
 
strady
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 23. Сентября 2013
Re: GO в запросе.
Ответ #2 - 31. Октября 2013 :: 19:49
Печать  
в теме http://www.1cpp.ru/forum/YaBB.pl?num=1323430854/11 есть пример
Код
Выбрать все
|IF OBJECT_ID (N'dbo.Уровень_Ном', N'FN') IS NOT NULL
|   DROP FUNCTION dbo.Уровень_Ном;
|	 GO
|	CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
|	RETURNS  Int
|	BEGIN
|	 DECLARE @R Char(9)
|	 DECLARE @Lev Int
|	 SET @Lev = 0
|	     SET @R = @IDSpr
|	     WHILE (@R <> $ПустойИД) AND (@R IS NOT NULL)
|	     BEGIN
|	     SELECT
|	     @R = PARENTID, @Lev = @Lev + 1
|	     FROM $Справочник.Номенклатура (nolock)
|	     WHERE
|	     (ID = @R)
|	     END
|	     RETURN @Lev
|	     END;
|	     GO
|	     SELECT dbo.Уровень_Ном(Номенклатура.ID) [Уровень]
|		   ,Номенклатура.DESCR [НомНаим]
|	     FROM $Справочник.Номенклатура AS Номенклатура (nolock)   



тут с GO как-то работает.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: GO в запросе.
Ответ #3 - 01. Ноября 2013 :: 07:28
Печать  
Если ты умен настолько, чтоб не слушать, что говорят тебе старшие, то что ты тут вообще забыл?

Во первых, по ссылке не нашел дословно того, что ты привел в цитате.
Во вторых - у кого работало? У тебя, или у постера?

Еще раз.
GO - это batch-separator для скулевой менеджмент-студии
это указатель, что до текущего места все следует выполняет одним запросом, а с этого - следующим.

И еще раз - в нотации 1с++ - то, что разделено GO должно выполнятся раздельным вызовом методов ВыполнитьСкалярный/ВыполнитьИнструкцию/etc.

Для тех, кто совсем в танке


Код
Выбрать все
RS = СоздатьОбъект("ODBCRecordset");
RS.Отладка(1);
RS.УстБД1С();
ТекстЗапроса = "
|IF OBJECT_ID (N'dbo.Уровень_Ном', N'FN') IS NOT NULL
|   DROP FUNCTION dbo.Уровень_Ном;"
RS.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "
|CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
|	RETURNS  Int
|	BEGIN
|	 DECLARE @R Char(9)
|	 DECLARE @Lev Int
|	 SET @Lev = 0
|	     SET @R = @IDSpr
|	     WHILE (@R <> $ПустойИД) AND (@R IS NOT NULL)
|	     BEGIN
|	     SELECT
|	     @R = PARENTID, @Lev = @Lev + 1
|	     FROM $Справочник."+ЭлементВид+" (nolock)
|	     WHERE
|	     (ID = @R)
|	     END
|	     RETURN @Lev
|END;"
RS.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "
|SELECT dbo.Уровень_Ном(Номенклатура.ID) [Уровень]
|		   ,Номенклатура.ID [Элемент $Справочник."+ЭлементВид+"]
|		   ,Номенклатура.ParentID [Родитель $Справочник."+ЭлементВид+"]
|	     FROM $Справочник."+ЭлементВид+" AS Номенклатура (nolock)
|WHERE
|    Номенклатура.ID = :Товар";

RS.УстановитьТекстовыйПараметр("Товар", Элемент);
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); 



У тебя даже комментарии на нужных местах стоят
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: GO в запросе.
Ответ #4 - 01. Ноября 2013 :: 09:19
Печать  
Я себе такую процедуру сделал и больше не переживал по этому поводу:
Код
Выбрать все
Процедура ВыполнитьСкрипт(ТекстЗапроса)
	RS = СоздатьОбъект("ODBCRecordset");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,РазделительСтрок,"##$$##");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"GOTO","##$__$##");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"GO",РазделительСтрок);
	Ткст = СоздатьОбъект("Текст");
	Ткст.ДобавитьСтроку(ТекстЗапроса);
	Для Сч=1 По Ткст.КоличествоСтрок() Цикл
		ТекстЗапроса = Ткст.ПолучитьСтроку(Сч);
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"##$$##",РазделительСтрок);
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"##$__$##","GOTO");
		RS.ВыполнитьСкалярный(ТекстЗапроса);
	КонецЦикла;
КонецПроцедуры
 

  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать