Функция CLR вызывает удаленный SQL Server

Я совершенно новичок в SQL Server CLR. Я понимаю, что мы должны использовать CLR при условии, что бизнес-логику действительно сложно реализовать в SQL.

У нас есть довольно много функций в VB.NET для обработки данных, таких как стандартизация данных. Я пытаюсь реализовать их через CLR. Функции сначала обращаются к удаленному серверу, чтобы получить некоторые справочные данные, а затем обрабатывают на локальном сервере.

Однако, как бы я ни пытался, я получил ошибку

System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта.

или он возвращает null с удаленного сервера.

Можем ли мы получить доступ к удаленному серверу в подпрограмме CLR? Если да, то как?


person Percy    schedule 03.03.2011    source источник


Ответы (2)


Вы можете получить доступ к удаленным серверам в .Net CLR, но не должны.

SQL-сервер работает в кооперативной многозадачной среде, т. е. потокам доверяют завершать и завершать свою обработку (так или иначе) своевременно. Если вы начнете делать такие вещи, как вызов удаленных методов (которые подвержены длительным задержкам), вы, вероятно, закончите голоданием рабочих потоков SQL-сервера, что в конечном итоге приведет к плохим вещам.

Также см. этот вопрос

person Justin    schedule 03.03.2011
comment
Краген, я понял, что мне следует использовать библиотеку sqlclient для подключения к удаленному серверу, а не подавать в суд на oledb в CLR. Если доступ к удаленным серверам не рекомендуется, лучше ли добавить этот сервер в качестве связанного сервера, а затем получить к нему доступ? - person Percy; 03.03.2011
comment
@Star Если вы пытаетесь получить доступ к удаленному SQL-серверу, то да, связанные серверы + распределенные запросы/транзакции, безусловно, подходят. - person Justin; 03.03.2011
comment
Краген, спасибо. Тогда я пойду к связанному серверу. Я не знаком с распределенными запросами, выполню поиск по этому вопросу. Еще раз спасибо за быстрый ответ. - person Percy; 03.03.2011

Да, ты можешь. Для этого вы можете использовать обычные классы SqlCommand и SqlConnection в среде .NET =, если удаленные серверы являются SQL-серверами, как я предполагаю.

Если это веб-серверы, да, вы можете использовать веб-сервисы.

На заметку. Будьте очень осторожны с тем, что вы делаете в CLR, потому что, как бы привлекательно ни выглядела CLR, у вас есть только около 512 МБ памяти под SQL 2005, и, добавив некоторые параметры запуска, вы можете увеличить ее до 2 ГБ. Просто знайте.

РЕДАКТИРОВАТЬ:

Основываясь на ваших комментариях, я предлагаю использовать связанный сервер, а затем локально воссоздать удаленную таблицу, а затем присоединиться к ней на локальном сервере.

Вам нужно будет убедиться, что вы повторно создаете индексы и ключи в локальном поле, и для ускорения делайте это после того, как вы вставили записи в таблицу, иначе создание ваших индексов на уже заполненной таблице займет много времени. .

person Ryk    schedule 03.03.2011
comment
Спасибо за информацию. Как я уже упоминал выше, я должен использовать соединение sqlclient, а не соединение Oledb. Если доступ к удаленным серверам не рекомендуется, лучше ли добавить этот сервер в качестве связанного сервера, а затем получить к нему доступ? - person Percy; 03.03.2011
comment
Вы можете использовать связанные серверы, но они сильно влияют на производительность, и обычно это трудно исправить. Если вы выполняете распределенные запросы из SQL в SQL, вам следует переосмыслить свою архитектуру, возможно, вы делаете что-то там, где этого делать не следует. - person Ryk; 04.03.2011
comment
У нас есть эталонная база данных на одном сервере SQL, и мы обрабатываем проекты на другом сервере SQL. Как лучше всего использовать справочную базу данных в качестве репозитория? Мы обрабатываем данные на сервере SQL, а не через другие API. - person Percy; 04.03.2011
comment
1) Я бы предложил удалить процесс с SQL-сервера и поместить его в службу Windows или на внешний компьютер, который может видеть оба сервера. Здесь вы можете проявить немного творчества в том, как это сделать. Затем вы можете передать ссылки на сервер обработки или, если это бизнес-логика, выполнить все в .NET на отдельном сервере. ИЛИ 2) если это слишком сложно, один из способов обойти соединение через связанные серверы (КОТОРОЕ ОЧЕНЬ МЕДЛЕННО), вы можете выбрать справочную таблицу и создать ее локально на сервере обработки, а затем присоединиться к это локально. - person Ryk; 04.03.2011
comment
Но ради скорости я любой ценой буду избегать распределенных запросов по связанному серверу. Да, он может это сделать, и да, документация говорит, что это работает, и да, это работает (медленно), но когда дела идут плохо и вам нужна скорость, это будет первым узким местом в вашем процессе, особенно объединение столбцов в связанном сервер. - person Ryk; 04.03.2011
comment
Когда вы говорите о создании таблицы локально на сервере обработки, нужно ли мне просто импортировать эталонные таблицы на сервер обработки со связанного сервера, а затем присоединиться к нему? Это имеет смысл для меня. Да, скорость жизненно важна, поскольку нам может потребоваться обработать миллионы записей. - person Percy; 04.03.2011
comment
Хорошо, допустим, у вас есть Table1 на удаленном сервере. 2 варианта. 1) Что я сделаю, так это сделаю SELECT * INTO tempdb.dbo.tempTable1 FROM linkedserver.db1.dbo.Table1, затем я продублирую первичный ключ во временной таблице, которая теперь является локальной, и все другие необходимые индексы, а затем просто присоединиться к этой таблице. 2) Создайте физическую копию удаленной таблицы в локальной базе данных (включая ключи, индексы и ограничения), затем вы можете каждый раз усекать и повторно заполнять эту таблицу, или вы можете просто копировать новые записи с помощью команды SQL 2008 EXCEPT. Я не уверен в типе стола удаленного ящика - person Ryk; 04.03.2011
comment
Так что это немного сложно, но это, по крайней мере, даст вам некоторое руководство. Если удаленная таблица вставляется только в нее, я бы выбрал вариант 2. Это означает, что вы всегда будете добавлять новые записи локально. В противном случае может стать немного сложно понять, что нужно вставлять и удалять, но очень выполнимо. В противном случае, если у вас хорошая скорость между ящиками, а удаленная таблица обновляется, вставляется, удаляется, я бы просто временно воссоздавал ее каждый раз, а затем использовал. Надеюсь, это поможет. - person Ryk; 04.03.2011