Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL CLR Stored procedure на C#  [new]
Romeo84
Member

Откуда:
Сообщений: 39
Подскажите, пожалуйста, по поводу написания CLR хранимых процедур.

Особенно интересует возможность использования курсоров! Надо делать сложную выборку и декларативно это через SELECT никак не указать. Гуглил на эту тему - ничего стоящего не нашёл. Как в коде C# объявить курсор..?

И ещё, возможно ли как-то вернуть из CLR Stored Procedure сложные структуры данных - типа массива объектов?

Спасибо!
9 окт 14, 01:24    [16679628]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
private void button1_Click(object sender, EventArgs e) {
  this.UseWaitCursor = true;
  System.Threading.Thread.Sleep(3000);
  this.UseWaitCursor = false;
}
9 окт 14, 01:37    [16679644]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Romeo84
Member

Откуда:
Сообщений: 39
Я имел ввиду, как реализовать, допустим, такую ситуацию

-- Open the Cursor declared.
OPEN C_Expired_Penalty_BlackList
FETCH NEXT FROM C_Expired_Penalty_BlackList INTO @MemberID,@Date
WHILE @@FETCH_STATUS = 0
BEGIN
 IF @Date > DATEPART(MONTH,getdate()+6) --  and if @MemberId = (select ...........)
 BEGIN
  ..........
 END
  FETCH NEXT FROM C_Expired_Penalty_BlackList INTO @MemberID,@Date
END

CLOSE C_Expired_Penalty_BlackList
DEALLOCATE C_Expired_Penalty_BlackList
9 окт 14, 02:48    [16679689]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
aleks2
Guest
Romeo84
Я имел ввиду, как реализовать, допустим, такую ситуацию

-- Open the Cursor declared.
OPEN C_Expired_Penalty_BlackList
FETCH NEXT FROM C_Expired_Penalty_BlackList INTO @MemberID,@Date
WHILE @@FETCH_STATUS = 0
BEGIN
 IF @Date > DATEPART(MONTH,getdate()+6) --  and if @MemberId = (select ...........)
 BEGIN
  ..........
 END
  FETCH NEXT FROM C_Expired_Penalty_BlackList INTO @MemberID,@Date
END

CLOSE C_Expired_Penalty_BlackList
DEALLOCATE C_Expired_Penalty_BlackList

Ты могешь написать запуск этого скрипта из CLR.
Нафига только?

ЗЫ. Если бы "курсор в CLR" был бы быстрее "просто курсора" - микрософт давно бы написала "курсор в CLR".
9 окт 14, 05:31    [16679727]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Romeo84
Подскажите, пожалуйста, по поводу написания CLR хранимых процедур.

Гугл подскажет.
Первая же ссылка в выдаче: http://msdn.microsoft.com/en-us/library/ms131094.aspx
Romeo84
Особенно интересует возможность использования курсоров!

Обычный SqlDataReader - это и есть ваш курсор.
Romeo84
Надо делать сложную выборку и декларативно это через SELECT никак не указать.

Если внутри курсора нет вызова ХП, то он в 99% случаев может быть переписан в запрос. Очень сомневаюсь, что ваш случай из оставшегося 1%.
Romeo84
И ещё, возможно ли как-то вернуть из CLR Stored Procedure сложные структуры данных - типа массива объектов?

Возврат выборки - SqlContext.Pipe.ExecuteAndSend(SqlCommand).

P.S. C CLR-процедурами/функциями имеет смысл возиться, если они используют что-то, чего в MSSQL нет в принципе - например, обработка текста регэскпами. В остальных случаях, когда возможна реализация стандартными t-sql-ными ХП, возня эта, по моему скромному, смысла не имеет.
9 окт 14, 06:10    [16679745]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Romeo84
Member

Откуда:
Сообщений: 39
Спасибо большое за ответы!

Пробую добавить в Visual Studio Ultimate 2012 в связке с SQL Server 2012 express хранимую процедуру на CLR в существующую базу данных.

Делаю по инструкции с MSDN:

1. В Визуал Студии добавляю новый проект: Templates -> SQL Server -> SQL Server Database project

После добавления в Server Explorer во группе Data connections появляется новая база данных с названием проекта. Но мне то нужно в проект добавить мою базу и удалить авто-созданную.

2. Пытаюсь добавить мою базу в проект: кликаю правой клавишей на проект -> Add database reference

2.1. В диалоговом окне от меня хотят Data-tier application (.dacpac) файл. Вот тут я и встрял..... Где его взять то? И почему нельзя просто указать имя сервера, базу данных, юзера и пароль?

PS по поводу пункта 2.1. в МСДНе написана ерунда какая-то
http://msdn.microsoft.com/ru-ru/library/vstudio/dxb6fxah(v=vs.110).aspx

К сообщению приложен файл. Размер - 134Kb
17 окт 14, 10:54    [16718704]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Вы можете добавить базу из другого проекта, а не с сервера.
Вероятно, Вы не понимаете, что делаете.
17 окт 14, 14:08    [16720798]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Romeo84
Подскажите, пожалуйста, по поводу написания CLR хранимых процедур.

Особенно интересует возможность использования курсоров! Надо делать сложную выборку и декларативно это через SELECT никак не указать. Гуглил на эту тему - ничего стоящего не нашёл. Как в коде C# объявить курсор..?
Romeo84
В C# нет курсоров -- это язык объектного/процедурного программирования. Курсор это понятие SQL Server. Вы можете из CLR процедуры открыть курсов на сервере через запросы, КОТОРЫЕ ВАМ НАПИСАЛИ выше, но в самом C# курсора нет. Там есть цикл.

И ещё, возможно ли как-то вернуть из CLR Stored Procedure сложные структуры данных - типа массива объектов?

Спасибо!


Если вы работает с БД, то вам лучше использовать Dataset. http://csharp.net-informations.com/dataset/csharp-dataset-tutorial.htm

У меня возник более глобальный вопрос -- что вы такое делаете, что вам нужно сложную логику загнать в CLR процедуру. Может вам в принципе надо писать на C# отдельное приложение или как минимум Script Block в SSIS.
17 окт 14, 16:33    [16722148]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Romeo84
Member

Откуда:
Сообщений: 39
Владислав Колосов
Вы можете добавить базу из другого проекта, а не с сервера.
Вероятно, Вы не понимаете, что делаете.


Я понимаю что я хочу сделать - добавить в существующую базу данных на sql server 2012 express CLR процедуру средствами Visual Studio 2012 ultimate. Вот в чём весь вопрос.

К сожалению, адекватного руководства, как это сделать, я не нашёл.

Я предполагаю, надо создать проект, добавить в него базу данных, а добавить хранимую процедуру, откомпилировать, деплоить, отладить..... и готово! Вот на этапе добавления базы данных в проект я и застрял, и мне, естественно, надо добавлять базу с другого сервера, а не из какого-то другого проекта. ((
17 окт 14, 16:58    [16722337]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Glory
Member

Откуда:
Сообщений: 104751
Romeo84
К сожалению, адекватного руководства, как это сделать, я не нашёл.

А BOL - Deploying CLR Database Objects недакватно ?
17 окт 14, 16:59    [16722352]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Romeo84
Особенно интересует возможность использования курсоров! Надо делать сложную выборку и декларативно это через SELECT никак не указать.
поделитесь, какая сложная выборка делается через курсор и не делается декларативно
17 окт 14, 17:13    [16722471]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Romeo84,

надо написать библиотеку и пометить функции аттрибутиами.

Всё элементарно, Ватсон

http://www.skylinetechnologies.com/Blog/Article/246/CLR-Functions-in-SQL-Server-A-Tutorial.aspx


делайте проект типа Class Library
17 окт 14, 18:10    [16722730]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Romeo84
Member

Откуда:
Сообщений: 39
Shakill
Romeo84
Особенно интересует возможность использования курсоров! Надо делать сложную выборку и декларативно это через SELECT никак не указать.
поделитесь, какая сложная выборка делается через курсор и не делается декларативно


Если в двух словах, то необходимо вычислить много финансовых формул, причём много строк с нарастающим итогом, сложными арифметическими операциями, и т.д.... Без хранимой процедуры либо на T-SQL, либо на CLR этого не получится ну никак.
18 окт 14, 02:15    [16724263]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Romeo84
Member

Откуда:
Сообщений: 39
a_voronin
Romeo84,

надо написать библиотеку и пометить функции аттрибутиами.

Всё элементарно, Ватсон

http://www.skylinetechnologies.com/Blog/Article/246/CLR-Functions-in-SQL-Server-A-Tutorial.aspx


делайте проект типа Class Library



ОГРОМНОЕ спасибо! Это то, что мне нужно было! Просто я думал, что в Visual Studio можно было б это сделать "чуть по-проще", то есть
"создал проект -> добавил свою базу данных -> создал хранимую процедуру -> деплоил -> и готово"!

А по Вашей ссылке надо ручками переносить сборку в базу данных.

Но все равно, огромное спасибо!
18 окт 14, 02:21    [16724268]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
Romeo84
Member

Откуда:
Сообщений: 39
Наконец то получилось написать clr хп указанным выше способом. Ещё раз спасибо.

Печально, конечно, что не получается сделать это через project template C# SQL CLR project в Визул Студии - такого шаблона просто нет у меня почему-то.

И ещё: деббагить процедуру не получается - в SQL Management Studio при попытке отладки пошаговой через F11 получаю ошибку Object reference not set to an instance of object, а через Визул Студио - после сообщения Attaching to process... требует исходный код с именем файла "=123".
18 окт 14, 03:25    [16724305]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Romeo84

ОГРОМНОЕ спасибо! Это то, что мне нужно было! Просто я думал, что в Visual Studio можно было б это сделать "чуть по-проще", то есть
"создал проект -> добавил свою базу данных -> создал хранимую процедуру -> деплоил -> и готово"!



Так можно сделать и как вы говорите. Вам надо зайти в Project Properties -> Build Events -> Post Build Evemt Command Line и вставить сюда командный файл, который будет деплоить вашу библиотеку после компиляции.
20 окт 14, 12:45    [16730452]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR Stored procedure на C#  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31957
Romeo84
Если в двух словах, то необходимо вычислить много финансовых формул, причём много строк с нарастающим итогом, сложными арифметическими операциями, и т.д.... Без хранимой процедуры либо на T-SQL, либо на CLR этого не получится ну никак.
Если это не учебный проект, а реальный, делайте лучше на T-SQL
Для обычных рутинных операций с таблицами не нужен CLR, вы же не картинки конвертите. Всё равно придётся переписывать.
20 окт 14, 22:09    [16733578]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить