выполнить функцию MSSQL с помощью SQL-DMO #676404


#0 by avz07
я раньше написал функцию в Microsoft SQL Server Management Studio. теперь хочу ее код с 1С передать на выполнение в SQL и получить результат. все организовать хочу через sql-dmo. но у меня не получается. Пожалуйста, помогите мне пожалуйста. вот функция: CREATE FUNCTION RES_PO_POLYU RETURNS int BEGIN DECLARE @RES int IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME='kod_1c') END GO
#1 by Jaap Vduul
#2 by avz07
если я правильно понял, должно быть так: СтрокаПровSQL="CREATE FUNCTION RES_PO_POLYU а параметр без изменений Messages,или здесь должна быть переменная которую возвращает функция?
#3 by avz07
извиняюсь RSProv=СКЛ.Databases(Строка(БД)).ExecuteWithResultsAndMessages2(СтрокаПровSQL ,Messages) asQueryResults;                                  .
#4 by Новенький_2009
а не проще саму функцию в базе создать, и обычным запросом получить резалт?
#5 by avz07
это пример на тестовой базе. есть бага бд по которым надо выполнять время от времени эту функцию
#6 by Новенький_2009
Был у меня пример где-то. Я тоже ёпся долго ;) Если найду - кину. Но я через ADO делал.
#7 by avz07
И от ADO не откажусь. Буду очень и очень благодарен!
#8 by МихаилМ
SQLDMO с мс скл 2008 не поддерживается. теперь rdo
#9 by avz07
если через RDO, то как осуществить подключение?
#10 by etc
не проще ли через ADO подсоединиться и сделать что-то типа: ADOConnection.Execute("CREATE FUNCTION RES_PO_POLYU ...
#11 by avz07
попытался так: и мне выдало ошибку: {Форма.Форма.Форма(2152)}: Ошибка при вызове метода контекста (Execute)     RSProv=Команда.Execute; по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Incorrect syntax near 'GO'. в SQL эта функция работает хорошо.не могу понять, почему системе не воспринимает оператор GO??
#12 by oleg_km
Потому что GO Это не оператор T-SQL, это оператор QA. Смело выкидываейте его и все будет работать
#13 by avz07
удалил GO  и заработало. но когда второй раз выполнил код мне выдало ошибку: {Форма.Форма.Форма(2152)}: Ошибка при вызове метода контекста (Execute)     RSProv=Команда.Execute; по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): There is already an object named 'RES_PO_POLYU' in the database. как выполнять эту функцию повторно? возможно удалять ее после выполнения?
#14 by ДенисЧ
дык проверяй на наличие перед созданием...
#15 by avz07
и если такая уже существует то удалять или повторить выполнение уже существующей?
#16 by ДенисЧ
это уже тебе решать :-) Я бы вообще фуннкцией для такого запроса не заморачивался...
#17 by etc
только можно было проще:
#18 by avz07
спасибо, но к сожалению так не подойдет, потому что без оператора GO пакет не передаст на исполнение..а этот GO вообще есть возможность заменить или что-то в этом роде??
#19 by ДенисЧ
"без оператора GO пакет не передаст на исполнение" Слушай... Поделись рецептиком.. Что такое забористое ты выпил?
#20 by avz07
я чего-то не совсем понимаю в материале ...?
#21 by avz07
Соединение = Новый COMОбъект("ADODB.Connection");    Соединение.Open(СтрокаСоединение);    Соединение.Execute("IF OBJECT_ID(N'dbo.REZ',N'FN')IS NOT NULL
#22 by avz07
как тут без GO?
#23 by avz07
а если с GO, то вот такая ошибка: {Форма.Форма.Форма(2136)}: Ошибка при вызове метода контекста (Execute)     Соединение.Execute("IF OBJECT_ID(N'dbo.REZ',N'FN')IS NOT NULL по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Incorrect syntax near 'GO'.
#24 by Зойч
какая ошибка без го?
#25 by avz07
{Форма.Форма.Форма(2136)}: Ошибка при вызове метода контекста (Execute)     Соединение.Execute("IF OBJECT_ID(N'dbo.REZ',N'FN')IS NOT NULL по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): 'CREATE FUNCTION' must be the first statement in a query batch.
#26 by avz07
возможно я неверно написал, возможно чего-то не знаю, не понимаю хорошо. подскажите или сбросьте какую-то литературу где такая ситуация описана.
#27 by avz07
а может через TADODataSet?
#28 by etc
раздели на 2 execut_а: Соединение.Execute("IF OBJECT_ID(N'dbo.REZ',N'FN')IS NOT NULL DROP FUNCTION dbo.REZ;"); Соединение.Execute("CREATE FUNCTION dbo.REZ                |RETURNS int
#29 by etc
"GO — это не инструкция Transact-SQL; это команда, распознаваемая программами sqlcmd и osql, а также редактором кода среды Среда SQL Server Management Studio. Программы SQL Server интерпретируют команду GO как сигнал о том, что им следует отправить текущий пакет инструкций Transact-SQL экземпляру SQL Server." ... "потому что гладиолус"
#30 by avz07
спасибо за помощь! я к этому дочитался. Но если разделить на две части, не увеличится ли время выполнения?
#31 by etc
Даже если бы это увеличивало время выполнения на пару секунд, у тебя что создание функции самая часто используеая операция? Наверняка максимум 1 раз за сессию.
#32 by avz07
нет. хочется, чтобы все было правильно, минимизировано.
#33 by ДенисЧ
Один раз создавай. Она что, у тебя каждый день меняется?
#34 by avz07
еще один вопрос: "как вывести результат если я сделаю через два execut_а"?
#35 by avz07
имею в виду результат выполнения функции
#36 by ДенисЧ
у адодб есть возможность NextRecordset сказать...
#37 by avz07
ДенисЧ, буду очень благодарен, если подскажете
#38 by Serginio1
#39 by avz07
тоесть, после этого: Соединение.Execute("CREATE FUNCTION dbo.REZ                |RETURNS int
#40 by Serginio1
CREATE FUNCTION dbo.REZ тебе ничего не вернет. Результат возвращает Select (не помню как там насчет No Count)
#41 by avz07
да, я что-то не то написал ..
#42 by avz07
сначала я создаю функцию, а потом мне ее надо вызвать, чтобы она выполнилась
#43 by avz07
вот жаль, я не умею это делать. с ADO первый раз работать начал
#44 by Serginio1
Если тебе нужно единажды вызвать можешь посмотреть в сторону CTE
#45 by avz07
да. эта функция будет вызывать 1 раз, только когда будет запускаться внешняяобработка с ней
#46 by avz07
что-то я не совсем понял эту статью.. возможно у кого-то есть какой-то пример?
#47 by Serginio1
#48 by Serginio1
#49 by avz07
какое отношение имеет рекурсивный запрос к моей функции?
#50 by avz07
вот что у меня получилось, но это не отражает результат:                               Соединение.Execute("CREATE FUNCTION dbo.REZ
#51 by Serginio1
А где "Select dbo.REZ as Result"
#52 by Serginio1
"Select dbo.REZ as Result"
#53 by Serginio1
И тебе не нужен NextRecordSet; он нужен когда вызываются несколько Select Проще использовать такой синтаксис Соединение.Execute("IF OBJECT_ID(N'dbo.REZ',N'FN')IS  NULL |Begin или разделять запросы через ;
#54 by avz07
за огромное спасибо!
#55 by avz07
попытался модифицировать код скл и столкнулся с той же ошибкой: не уникальное имя функции в пакете. вот код: IF OBJECT_ID(N'dbo.REZ',N'FN')IS NOT NULL BEGIN    DROP FUNCTION dbo.REZ; END ELSE BEGIN       CREATE FUNCTION dbo.REZ END
#56 by Serginio1
Ну дык IF OBJECT_ID(N'dbo.REZ',N'FN')IS NOT NULL BEGIN    DROP FUNCTION dbo.REZ;
#57 by avz07
Serginiol, большое спасибо за Вашу помощь! Я и так, как вы мне сбросили, пробовал делать. К сожалению ошибка все та же..
#58 by Serginio1
Смотрим такая конструкция должна работать IF OBJECT_ID (N'dbo.REZ', N'FN') IS NOT NULL     DROP FUNCTION dbo.REZ; CREATE FUNCTION dbo.REZ FN = скалярная функция SQL Для проверки сделай запрос Select OBJECT_ID (N'dbo.REZ', N'FN')
#59 by Ёпрст
не будет
#60 by Ёпрст
работать
#61 by avz07
да, такая конструкция работает, но с переключателем GO, который информирует об окончании пакета иструкций. А в пакете инструкций, имя функции должно быть уникальное (без повторений). Эту уникальность обеспечивал переключатель GO. разве что ADO интерпретирует его самостоятельно. Потому, что в СКЛ так работать не будет.
#62 by Ёпрст
чего-й то ты всё перепутал
#63 by avz07
, я читал эти статьи. Возможно я что-то пропустил. но будто правельно все сделал и в Менеджере СКЛ, когда пробовал все пахало. А когда начал подстраиваться под 1С, то возникли трудности.
#64 by Serginio1
а так   IF OBJECT_ID (N'dbo.REZ', N'FN') IS NOT NULL
#65 by Serginio1
У меня такие конструкции Стр=" прекрасно работают. В пакетном запросе операторы разделяются ;
#66 by Ёпрст
автору надо просто делать как в и привет.. т.е делать отдельными запросами дроп и креайт функции .. и усё.
#67 by Serginio1
Можно и так, только можно и в одно пакетном запросе. Просто на семерке в 1с++ приходится включать set nocount on ТекстЗапроса="         |set nocount on
#68 by Ёпрст
да нет пакета в адо
#69 by Ёпрст
вот и ошибки у него валются..
#70 by Serginio1
Есть возможность выполнения нескольких операторов разделенных точкой с запятой. А вот откуда у него ошибки это вопрос и какой у него MS SQL
#71 by Serginio1
По set nocount on разобрался В ADO Insert возвращает recordset если set nocount off
#72 by avz07
MS SQL 2008, не R2
#73 by avz07
вот что сделал я:     Соединение.Execute("CREATE FUNCTION dbo.REZ
#74 by Serginio1
А 56 что выдает?
#75 by avz07
в 1С пишет что ошибка метода Execute по причине:произошло исключительная ситуация... А Менеджер СКЛ видает такое: Сообщение 111, уровень 15, состояние 1, строка 6 'CREATE FUNCTION' must be the first statement in a query batch. Сообщение 178, уровень 15, состояние 1, строка 14 A RETURN statement with a return value cannot be used in this context. подчеркивает CREATE FUNCTION dbo.REZ
#76 by avz07
обидно что мне не получается написать все одним пакетом, но надо сдать задание .. если кто-то посоветует еще что-небуть, буду сердечно благодарен. а так, всем спасибо за участие в обсуждении!
#77 by Serginio1
Да смутно припоминаю на ограничения для функций, что они дожны быть первыми в пакетном запросе. Так, что ничего страшного.
#78 by avz07
Serginio1, вам отдельное спасибо за активное участие и помощь!
#79 by Serginio1
Попробуй через exec
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С