2015-07-25 4 views
0

У меня есть программное обеспечение, которое можно читать только из таблиц или представлений. Мне нужно предоставить этому программному обеспечению некоторые данные из метода clr (например, данные из веб-служб). Это программное обеспечение будет читать данные так:Вывод сохраненной процедуры для просмотра

select * from my_view WHERE somefield = 'data_identificator' 

Тогда clr нужно получить, что SomeField в качестве параметра и выполнить какой-либо другой код, а затем возвращает результаты, как результат из поля зрения. Это вообще возможно ?

+0

да вы можете передать параметр вместо 'data_identificator' – wiretext

+0

А как? Пожалуйста, укажите мне, как я могу это сделать? – VikciaR

+1

Невозможно сделать это в представлении, но можете ли вы вызвать функцию? –

ответ

0

Итак, после некоторых исследований и на основе комментариев от srutzky и JamesZ окончательный ответ.

  1. Создать таблицу CLR.
  2. Создайте представление из некоторой справочной таблицы, где хранятся все возможные значения параметров запроса. Я не знаю, как избавиться от него. (Для меня это не проблема, у меня такая таблица).

CREATE VIEW [dbo].[MyView] AS SELECT a.*, s.ValueFromTvf FROM HelpTable a CROSS APPLY dbo.MyClrFunction(a.PropertyA) s

Если I SELECT с этой точки зрения:
SELECT * FROM MyView
WHERE PropertyA = '123456'
MyClrFunction будет выполняться с параметром '123456'.

1

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

Да, с помощью SQLCLR можно получить данные из внешних источников, таких как веб-службы и т. Д. Вы можете написать специализированные скалярные или табличные функции для вызова определенных методов и возврата обработанного вывода. Или вы можете создать универсальную функцию, которая возвращает полученный XML, а затем проанализирует это в T-SQL.

Если вам нужно выполнить несколько шагов, вы можете вызвать эту функцию SQLCLR из T-SQL многозначной табличной функции. Это даже дает вам возможность передавать параметры.

Вашего программное обеспечение «который может читать только из таблиц или представлений» должны быть в состоянии SELECT из этого Multistatement Таблица функции (ТВФ), поскольку она действует как View, который можно передать параметры в. Если ваше программное обеспечение по какой-либо причине не может выбрать из TVF, вы можете обернуть SELECT field1, field2, ... FROM dbo.MyTVF(); в View.

Как именно вы пишете такую ​​функцию SQLCLR для вызова веб-службы? Не так быстро. Если вы задаете этот вопрос в первую очередь, тогда код копирования и вставки такого рода в проект может принести больше вреда, чем пользы. Да, на разных сайтах, возможно даже здесь, есть несколько примеров вызова веб-службы в функции или процедуре SQLCLR, но некоторые (возможно, даже большинство?) Выполняются очень плохо. Даже если у вас есть опыт программирования .NET, существует немало нюансов для CLR-сервера SQL Server, о которых вам нужно знать. Таким образом, вы действительно не должны писать код SQLCLR, не понимая вначале ограничений среды и как правильно взаимодействовать с SQL Server. Чтобы помочь в этом, я начал писать серию на SQL Server Central: Stairway to SQLCLR (требуется бесплатная регистрация).

Я также отметить, что для тех, кто заинтересован в заходящих URI, но не желают или не в состоянии писать код, чтобы сделать это, есть табличное значение Функция называется INET_GetWebPages в библиотеке SQL# SQLCLR, что делает это. Полное раскрытие: я являюсь автором SQL #, и, хотя есть бесплатная версия, функция INET_GetWebPages доступна только в полной версии.

+0

Ок, я создал TVF. Но тогда я не могу передать параметры select * из TVF() WHERE field1 = 'somedata'. Или это возможно? – VikciaR

+0

Было бы просто, если бы внутренний CLR вернул большой набор данных, но что, если мне нужно предоставить некоторый параметр ему из предложения SELECT? – VikciaR

+0

@VikciaR Да, CLR TVF может возвращать полный набор результатов. Чтобы передать значения в TVF из 'SELECT', вы _can_ используете либо' CROSS APPLY' (работает как INNER JOIN: нет результатов из TVF исключить строки из SELECT) или 'OUTER APPLY' (работает как OUTER JOIN: вы получаете строки из SELECT, даже если из TVF ничего не возвращается). ОДНАКО, будьте осторожны, чтобы не ожидать предложения WHERE, чтобы предотвратить вызов TVF. Если основной SELECT возвращает много строк, которые будут отфильтрованы, вы должны сначала сохранить эти результаты в переменной таблицы, а затем SELECT из переменной таблицы с CROSS APPLY в CLR TVF. –

Смежные вопросы