Статистика — различия между версиями
Elena (обсуждение | вклад) |
м (→Диаграммы и настройка) |
||
(не показано 10 промежуточных версии 3 участников) | |||
Строка 1: | Строка 1: | ||
+ | <code>[[Техническая документация]] / [[Call-центр]] / [[Статистика]] </code> | ||
+ | |||
+ | |||
Модуль статистики call-центра доступен супервизорам, администраторам и другим пользователям, обладающим соответствующим правом. Для пользования модулем необходимо зарегистрироваться в call-центре системы. Служит для построения хронологических отчетов различной формы и содержания. | Модуль статистики call-центра доступен супервизорам, администраторам и другим пользователям, обладающим соответствующим правом. Для пользования модулем необходимо зарегистрироваться в call-центре системы. Служит для построения хронологических отчетов различной формы и содержания. | ||
Строка 23: | Строка 26: | ||
− | Содержание и количество прочих отчетов не ограничено. По умолчанию модуль содержит ряд предустановленных отчетов, оценивающих основные показатели работы call-центра на основе полной статистики, собираемой системой в отдельную БД. | + | Содержание и количество прочих отчетов не ограничено. По умолчанию модуль содержит ряд предустановленных отчетов, оценивающих основные показатели работы call-центра на основе полной статистики, собираемой системой в отдельную БД. Статистическая БД Oktell хранит данные в виде пространственной модели (OLAP-кубов), данные в которую попадают в процессе работы. Перечень существующих в ней кубов продолжает расширяться. Это и куб коммутаций, попыток звонков по задачам, куб состояний операторов, куб состояний очереди ожидания. Подробнее в разделе [[Структура пространственной БД]]. |
− | Пользователи системы могут редактировать существующие отчеты и создавать новые. Также доступны функции экспорта и импорта отчетов, позволяющими вести динамический обмен со сторонними пользователями и разработчиками. | + | Пользователи системы могут редактировать существующие отчеты и создавать новые. Также доступны функции экспорта и импорта отчетов, позволяющими вести динамический обмен со сторонними пользователями и разработчиками. |
+ | |||
+ | Отчеты подчиняются политике прав доступа. Параметры доступа к ним определяются на соответствующей вкладке «Доступ». Доступные привилегии: чтение, изменение. Также применяется общая ролевая привилегия ''«Возможность редактирования запросов SQL»'' | ||
Строка 41: | Строка 46: | ||
− | {| | + | {|cellpadding="10" cellspacing="0" border="1" |
|График | |График | ||
|Одна ось, каждый элемент оси может иметь несколько показателей. На одном изображении разным цветом строятся графики соответствующих показателей. Масштаб отображения показателей может быть общим или раздельным на усмотрение создателя отчета. | |Одна ось, каждый элемент оси может иметь несколько показателей. На одном изображении разным цветом строятся графики соответствующих показателей. Масштаб отображения показателей может быть общим или раздельным на усмотрение создателя отчета. | ||
Строка 51: | Строка 56: | ||
Поддерживает выгрузку в файл изображения. Поддерживает большие объемы данных, отображая графически-зависимую полосу прокрутки. | Поддерживает выгрузку в файл изображения. Поддерживает большие объемы данных, отображая графически-зависимую полосу прокрутки. | ||
|[[Файл:cl_cc_stat_i8.png]] | |[[Файл:cl_cc_stat_i8.png]] | ||
+ | |- | ||
+ | |<div id="VertHysto"></div>Вертикальная гистограмма | ||
+ | |Аналогична графику, но ориентирована вертикально. | ||
+ | |[[Файл:cl_cc_stat_i10.png]] | ||
|- | |- | ||
|Соотношение | |Соотношение | ||
Строка 62: | Строка 71: | ||
|[[Файл:cl_cc_stat_i4.png]] | |[[Файл:cl_cc_stat_i4.png]] | ||
|- | |- | ||
− | |Плоскость | + | |<div id="Plane"></div>Плоскость |
|Две оси. Отображается только один показатель (первый из показателей в запросе). На пересечении осей (горизонтальной и вертикальной) выводится значение показателя с подсветкой, интенсивность которой соответствует величине соответствующего показателя. | |Две оси. Отображается только один показатель (первый из показателей в запросе). На пересечении осей (горизонтальной и вертикальной) выводится значение показателя с подсветкой, интенсивность которой соответствует величине соответствующего показателя. | ||
Поддерживает выгрузку в MSExcel в виде транспонированной таблицы | Поддерживает выгрузку в MSExcel в виде транспонированной таблицы | ||
Строка 150: | Строка 159: | ||
Пользовательские типы фильтров (список и набор) требуют задания SQL-запроса для формирования списка доступных значений. Для задания или изменения текущего запроса какого-либо элемента фильтра с пользовательским типом необходимо щелкнуть в правой части таблицы параметров (в последнем столбце, содержащем «...»), в строке интересующего элемента. В открывшемся окне скорректировать запрос, после чего закрыть окно. Запрос должен представлять собой один пакет (batch) и может иметь любую сложноcть. Однако следует учитывать, что постоянное его выполнение в ходе создания фильтра может привести к длительным задержкам, в случае, если время выполнения созданного запроса достаточно велико. В качестве результатов берется первый возвращаемый набор данных. Первый столбец считается идентификатором, значение (или таблица значений) которого будет передано в основной запрос отчета на этапе его построения. Второй столбец - описания, подставляемые в визуальные компоненты для отображения. А качестве идентификаторов могут выступать любые типы, за исключением TEXT, NTEXT, TIMESTAMP. | Пользовательские типы фильтров (список и набор) требуют задания SQL-запроса для формирования списка доступных значений. Для задания или изменения текущего запроса какого-либо элемента фильтра с пользовательским типом необходимо щелкнуть в правой части таблицы параметров (в последнем столбце, содержащем «...»), в строке интересующего элемента. В открывшемся окне скорректировать запрос, после чего закрыть окно. Запрос должен представлять собой один пакет (batch) и может иметь любую сложноcть. Однако следует учитывать, что постоянное его выполнение в ходе создания фильтра может привести к длительным задержкам, в случае, если время выполнения созданного запроса достаточно велико. В качестве результатов берется первый возвращаемый набор данных. Первый столбец считается идентификатором, значение (или таблица значений) которого будет передано в основной запрос отчета на этапе его построения. Второй столбец - описания, подставляемые в визуальные компоненты для отображения. А качестве идентификаторов могут выступать любые типы, за исключением TEXT, NTEXT, TIMESTAMP. | ||
+ | Для привязки запросов к конкретным пользователям, осуществляющим построение отчетов, можно использовать предопределенную переменную ''@authorizeduserid'' (в отчетах из хранимых процедур - таблицу ''#authorizeduserid''). | ||
− | |||
− | + | <span style="color:green;">Примеры запросов на формирование пользовательского фильтра</span>: | |
− | + | <pre>Select [Id], [Caption] From dbo.[ClientTypes] | |
− | + | ||
+ | |||
+ | Declare @dttoday DateTime | ||
+ | |||
+ | Set @dttoday = Cast ( Floor ( Cast ( GetDate() as float ) ) as DateTime ) | ||
+ | |||
+ | Select [Id], [Name] | ||
− | + | From dbo.[Clients] cl | |
− | + | Inner join dbo.[ClientCalls] cc on cl.[Id] = cc.[IdClient] | |
− | + | Where [LastCall] > @dttoday | |
− | + | Group By [Id], [Name]</pre> | |
− | |||
Строка 188: | Строка 202: | ||
-------------------------------------------------------------------</pre> | -------------------------------------------------------------------</pre> | ||
− | + | <pre>SET FMTONLY OFF | |
− | |||
− | + | Declare @emptyname nvarchar ( 30 ) | |
+ | |||
+ | Set @emptyname = '' | ||
− | |||
− | + | Declare @hasnames bit | |
− | + | Set @hasnames = 0 | |
− | + | Declare @idlist uniqueidentifier | |
− | + | Select @idlist = ListId From A_TaskManager_Tasks t where Id = @idtask | |
− | + | if ( @idlist is null ) | |
+ | |||
+ | Set @emptyname = '<список удален>' | ||
− | |||
− | + | Declare @abons table ( Id int, Name nvarchar ( 200 ) ) | |
− | + | ||
− | + | Declare @type int | |
− | + | Declare @query nvarchar ( 4000 ) | |
− | + | Declare @jtable nvarchar ( 1000 ) | |
− | + | Declare @colname nvarchar ( 50 ) | |
− | + | Declare @colid nvarchar ( 50 ) | |
− | + | ||
− | + | Select @type = Type, @query = Query, @jtable = JoinedTable, @colid = ColumnId, @colname = ColumnName | |
+ | |||
+ | From A_TaskManager_Lists | ||
+ | |||
+ | Where Id = @idlist | ||
− | |||
− | + | Declare @tmpic table ( Id int, Name nvarchar ( 1000 ) ) | |
+ | |||
+ | |||
+ | |||
+ | if ( Len ( @colid ) > 0 ) and ( Len ( @colname ) > 0 ) and ( not @type is null ) | ||
+ | |||
+ | begin | ||
− | + | Declare @extquery nvarchar ( 4000 ) | |
− | + | if exists ( Select * From tempdb..sysobjects Where Id = object_id ( 'tempdb..#tmpic' ) ) | |
− | + | Drop Table #tmpic | |
− | + | Create table #tmpic ( id int, name nvarchar ( 1000 ) ) | |
− | + | if ( Len ( @jtable ) > 0 ) and ( @type in ( 1, 2 ) ) | |
− | + | begin | |
− | + | Set @extquery = 'Select ' + @colid + ' as Id, Cast ( IsNull ( ' + | |
− | @colname + | + | @colname + ', ''' + @emptyname + |
− | + | ''' ) as nvarchar ( 1000 ) ) as Name From ' + @jtable | |
− | + | Insert into #tmpic | |
− | + | Exec sp_sqlexec @extquery | |
− | + | Set @hasnames = 1 | |
− | + | end | |
− | + | else if ( Len ( @query ) > 0 ) and ( @type = 3 ) | |
− | + | begin | |
− | + | Set @extquery = 'Select ' + @colid + ' as Id, Cast ( IsNull ( ' + | |
− | @colname + | + | @colname + ', ''' + @emptyname + |
− | + | ''' ) as nvarchar ( 1000 ) ) as Name From (' + @query + ')a' | |
− | + | Insert into #tmpic | |
− | + | Exec sp_sqlexec @extquery | |
− | + | Set @hasnames = 1 | |
− | + | end | |
− | + | Insert into @tmpic | |
− | + | Select * From #tmpic | |
− | + | Set @emptyname = '<не найден>' | |
− | + | Update @tmpic | |
− | + | Set Name = @emptyname | |
− | + | Where Name = '' | |
− | + | Drop Table #tmpic | |
− | + | Set @emptyname = '<не задано>' | |
− | + | end</pre> | |
+ | |||
+ | |||
<pre> | <pre> | ||
------------------------------------------------------------------- | ------------------------------------------------------------------- |
Текущая версия на 09:31, 25 мая 2023
Техническая документация / Call-центр / Статистика
Модуль статистики call-центра доступен супервизорам, администраторам и другим пользователям, обладающим соответствующим правом. Для пользования модулем необходимо зарегистрироваться в call-центре системы. Служит для построения хронологических отчетов различной формы и содержания.
Журнал звонков
Самым основным отчетом является журнал звонков. Полученная с помощью фильтра, накладываемого на выборку, информация дает возможность прослушать любую из перечисленных в таблице коммутаций. Дважды щелкните на записи для отображения проигрывателя.
Данные, отображаемые пользователю, помимо установленного им фильтра будут отфильтрованы согласно правам на проекты. Информация по задаче в журнале видна только ее супервизорам и имеющим доступ к ее проекту.
ВНИМАНИЕ! При запросе больших объемов данных необходимо учитывать, что это создает дополнительную нагрузку на процессорное время сервера БД и сетевой трафик. В некоторых случаях это может отразиться на качестве разговоров, осуществляющихся через VoIP шлюз сервера.
Полученные результаты доступны для экспорта в текстовые файлы, в файлы MS Excel и HTML. Также доступна выгрузка записей всех разговоров, попадающих под условие фильтра. Необходимо иметь в виду, что выгрузка записей осуществляется в их текущем состоянии. Используйте предварительное микширование, чтобы гарантировать объединение разговоров в один файл.
Диаграммы и настройка
Содержание и количество прочих отчетов не ограничено. По умолчанию модуль содержит ряд предустановленных отчетов, оценивающих основные показатели работы call-центра на основе полной статистики, собираемой системой в отдельную БД. Статистическая БД Oktell хранит данные в виде пространственной модели (OLAP-кубов), данные в которую попадают в процессе работы. Перечень существующих в ней кубов продолжает расширяться. Это и куб коммутаций, попыток звонков по задачам, куб состояний операторов, куб состояний очереди ожидания. Подробнее в разделе Структура пространственной БД.
Пользователи системы могут редактировать существующие отчеты и создавать новые. Также доступны функции экспорта и импорта отчетов, позволяющими вести динамический обмен со сторонними пользователями и разработчиками.
Отчеты подчиняются политике прав доступа. Параметры доступа к ним определяются на соответствующей вкладке «Доступ». Доступные привилегии: чтение, изменение. Также применяется общая ролевая привилегия «Возможность редактирования запросов SQL»
Технология OLAP в простом виде позволяет получить из пространственных таблиц любые срезы. Несмотря на простоту использования звездной схемы пространственной БД, большинство сложных отчетов строятся не путем среза данных OLAP-куба, а на основе отдельных различной степени сложности алгоритмов. При создании отчетов администратор баз данных может подключить в качестве источника данных любой запрос как из всех баз данных Oktell, так и из любых других баз данных. Таким же образом можно производить анализ полученных данных в каждом конкретном проекте, строя отчеты под конкретные задачи, в частности на основе таблиц абонентов.
Этот механизм полной произвольности отчетов предоставляет широкие возможности как для администраторов БД, так и для супервизоров.
В основе любого отчета лежит выборка данных, в которой есть одно или несколько полей с показателями, а также поля категорий, по которым эти показатели строятся. В зависимости от типа отображения отчета, категории объединяются в одну или несколько осей.
Среди вариантов отображения:
Каждый отчет может содержать произвольный фильтр.
Выбрав в списке интересующий отчет, супервизору необходимо задать значения для установленного в отчете фильтра (даты, время, операторы, задачи и произвольный набор других параметров, использованных создателем отчета при его формировании). После нажатия кнопки «Отобразить» отчет примет вид в соответствии с его настройкой на основе данных, полученных из БД. Нажав кнопку «Экспортировать» супервизор может выгрузить отчет в MS Excel в том виде, в котором он представлен в его клиентском модуле Oktell.
Создание отчетов должно вестись людьми, имеющими представление о структуре данных.
- Описание. Краткое или полное описание отчета. Доступно супервизору на вкладке диаграммы по щелчку на пиктограмме с вопросительным знаком. В случае, когда супервизору по соображениям безопасности запрещен доступ к вкладке настроек, это единственный способ доступа к описанию.
- Группа. Перечень групп, к которым относится редактируемый отчет. На этапе редактирования прямым заданием текста могут быть созданы новые группы. Используются для фильтрации на вкладке настроек.
- Тип диаграммы. Один из приведенных выше вариантов отображения результатов отчета.
- Тип формирования. Пользовательский режим создания отчетов дает возможность формирования простых агрегирующих срезов OLAP. Доступны также обобщенные механизмы формирования отчетов на основе текста запросов SQL и на основе хранимых процедур.
Для создания отчета на базе текста запроса SQL в режиме редактирования на вкладке «Свойства» выберите тип формирования «Запрос SQL». Перейдите на вкладку «Данные» и заполните поле запроса в соответствии со своей задачей. Запрос может быть практически любой сложности с единственным ограничением: весь запрос будет передан на обработку одним пакетом. При необходимости задайте входные параметры, подставляемые из фильтра. Для создания отчета на базе хранимой процедуры в режиме редактирования на вкладке «Свойства» выберите вариант «Хранимая процедура». После перехода на вкладку данных в выпадающем дереве необходимо выбрать базу и хранимую процедуру (также можно ввести полное имя процедуры в ручном режиме). Автоматически будут загружены все ее параметры, для которых необходимо назначить типы. Параметры попадут в фильтр при построении отчета. Отчеты на основе хранимых процедур позволяют удобно отлаживать сложные запросы, а также использовать весь функционал, доступный для них.
Автообновление отчетов. В некоторых случаях необходимы отчеты, которые постоянно выводят на экран свежие данные. Для этого в свойствах отчета необходимо установить период автообновления. При запуске расчета будет запущен процесс обновления информации (перерасчета) через установленные промежутки времени.
Сохраните запрос, и он сразу же станет доступным для использования.
Для экспорта отчета в файл выделите необходимые отчеты и нажмите кнопку «Экспорт» слева внизу (или выберите соответствующий пункт в контекстном меню), а в предложенном окне укажите путь.
Для импорта отчетов нажмите «Импорт» (или выберите соответствующий пункт в контекстном меню) и в окне выбора файлов выделите один или несколько файлов отчетов. При неуспешном импорте во всплывающем окне будет подведен итог количества успешно и неуспешно импортированных отчетов. Импорт может быть осуществлен с заменой идентификаторов отчетов. В обычном режиме при обнаружении в системе отчета с совпадающим кодом он будет перезаписан. При импорте с заменой идентификатора при обнаружении совпадения код импортируемого отчета заменяется на уникальный новый.
Если в системе установлено очень много отчетов, и они мешают восприятию, часть редко используемых специфических отчетов можно экспортировать и хранить отдельно, удалив из системы.
В запросе могут быть использованы параметры, которые необходимо будет ввести пользователю перед формированием отчета (перед отправкой запроса на выполнение). Все параметры в запросе (как это принято в MS SQL) обозначаются через одинарный символ «@», например @paramname. Используйте их в тексте запроса по своему усмотрению. Помимо переданных извне параметров в запросе могут присутствовать и внутренние переменные, обозначающиеся таким же способом. Отличие переменной от параметра в том, что переменная в тексте запроса однократно объявляется перед использованием с помощью директивы «Declare», например «DECLARE @var1 INT, @var2 nvarchar(200)». Если в запросе отрезок текста начинается с однократного @, и не является переменной, он автоматически считается параметром. Все параметры должны быть объявлены. Для этого используется верхнее поле в интерфейсе настройки отчета. Задайте необходимое число параметров: укажите их идентификаторы, типы и заголовки (для удобного восприятия пользователем при формировании фильтра). Если все корректно, то после нажатия кнопки «Выполнить» запрос считается компилируемым и поля затеняются. Любое изменение в любом из двух полей (поля фильтра и SQL-запрос) автоматически снимет флаг компилируемости.
Следите за тем, чтобы не использовались одинаково именованные параметры. Это не приведет ни к чему адекватному.
Стоит отметить, что каждый тип параметра в фильтре представляет собой переменную определенного типа. Среди них int, nvarchar, bit, datetime. Однако существуют в перечне и более сложные параметры: временнЫе интервалы и врЕменные таблицы (наборы).
Временной интервал представляет для пользователя поле с выпадающим вниз инструментом Oktell «Календарь». Выбрав период, пользователь указывает на две даты – начало и конец интервала. В параметрах фильтра они задаются двумя разными идущими подряд строчками, а отображаются в фильтре единым полем.
Категория «Набор» для пользователя, заполняющего фильтр, представляет собой совокупность галочек соответствующего множества элементов (операторы, состояния, задачи, проекты, результаты задач). Для администратора БД, создающего отчет в виде SQL-запроса подобный идентификатор является не параметром-переменной, а параметром-таблицей с единственным полем «Id» внутри. Именно в ней будут сохранены строки, соответствующие элементам, включенным в набор. В отчетах на базе текста SQL обращение к этим таблицам осуществляется с префиксом «@», в отчетах на базе хранимых процедур - с префиксом «#».
Перечень всевозможных типов параметров с указанием соответствующих им типов в SQL, которые можно использовать в фильтре:
- Целое число (int)
- Вещественное число (float)
- Строка (nvarchar)
- Галочка (bit)
- Галочка с 3 состояниями (int)
- Дата (datetime)
- Интервал дат (начало) (используется в паре с «интервал дат-конец») (datetime, datetime)
- Интервал дат (конец) (используется в паре с «интервал дат-начало») (datetime, datetime)
- Время (datetime)
- Временной интервал (начало) (используется в паре с «временной интервал-конец») (datetime, datetime)
- Временной интервал (конец) (используется в паре с «временной интервал-начало») (datetime, datetime)
- Оператор (uniqueidentifier)
- Набор операторов ( table ( Id uniqueidentifier ) )
- Задача (uniqueidentifier)
- Набор задач ( table ( Id uniqueidentifier ) )
- Проект (uniqueidentifier)
- Набор проектов ( table ( Id uniqueidentifier ) )
- Статус оператора (int)
- Набор статусов операторов ( table ( Id int ) )
- Результат задачи (int)
- Набор результатов задачи ( table ( Id int ) )
- Пользовательский список ( тип, соответствующий запросу пользователя на определение списка, или sql_variant )
- Пользовательский набор ( table ( Id sql_variant ) )
Пользовательские типы фильтров (список и набор) требуют задания SQL-запроса для формирования списка доступных значений. Для задания или изменения текущего запроса какого-либо элемента фильтра с пользовательским типом необходимо щелкнуть в правой части таблицы параметров (в последнем столбце, содержащем «...»), в строке интересующего элемента. В открывшемся окне скорректировать запрос, после чего закрыть окно. Запрос должен представлять собой один пакет (batch) и может иметь любую сложноcть. Однако следует учитывать, что постоянное его выполнение в ходе создания фильтра может привести к длительным задержкам, в случае, если время выполнения созданного запроса достаточно велико. В качестве результатов берется первый возвращаемый набор данных. Первый столбец считается идентификатором, значение (или таблица значений) которого будет передано в основной запрос отчета на этапе его построения. Второй столбец - описания, подставляемые в визуальные компоненты для отображения. А качестве идентификаторов могут выступать любые типы, за исключением TEXT, NTEXT, TIMESTAMP.
Для привязки запросов к конкретным пользователям, осуществляющим построение отчетов, можно использовать предопределенную переменную @authorizeduserid (в отчетах из хранимых процедур - таблицу #authorizeduserid).
Примеры запросов на формирование пользовательского фильтра:
Select [Id], [Caption] From dbo.[ClientTypes] Declare @dttoday DateTime Set @dttoday = Cast ( Floor ( Cast ( GetDate() as float ) ) as DateTime ) Select [Id], [Name] From dbo.[Clients] cl Inner join dbo.[ClientCalls] cc on cl.[Id] = cc.[IdClient] Where [LastCall] > @dttoday Group By [Id], [Name]
После формирования запроса и успешной его проверки выставляется флаг компилируемости. Из получающейся в результате выполнения запроса выборки выделяются столбцы и помещаются в нижнюю часть интерфейса в таблицу «Назначение». Здесь в зависимости от типа выбранного визуального представления запроса необходимо проставить нужным столбцам соответствующие типы и задать описания (для удобного восприятия отчета пользователем)
Среди типов уже рассмотренные выше «Ось» и «Значение». Тип «Не отображается» указывает построителю отчета на отсутствие необходимости использовать поле. Для отчета типа «Плоскость» среди типов вместо «Ось» появляются два «Горизонтальная ось» и «Вертикальная ось». Для табличных отчетов все поля типа «Ось» будут подсвечены в результирующем поле. Не отображаемые поля будут пропущены при выводе данных и при экспорте.
ВНИМАНИЕ! При использовании временных таблиц # в отчетах на основе текстового запроса, необходимо в начале тела запроса помещать команду SET FMTONLY OFF, иначе использование # не будет возможным. В других случаях не рекомендуется использовать указанную команду. При обнаружении некорректных ситуаций при использовании # или других команд рекомендуется преобразовать отчет в хранимую процедуру.
ВНИМАНИЕ! В некоторых отчетах могут понадобиться данные из прикрепленной таблицы абонентов. Операция обращения к ней тривиальна в случае работы с внешней таблицей, и может быть проблематична при работе с локальной таблицей в силу специфики ее хранения (если для нее выбрана автоматическая генерация имени). Это необходимо учитывать при формировании проекта. Для удобства работы с отчетами внутри системы рекомендуются к использованию внешние таблицы, а также локальные таблицы с явным указанием имени и типов полей. Ниже приведен пример кода для формирования временной таблицы с полями Id и Name с данными из произвольной (в том числе и локальной) прикрепленной таблицы абонентов.
------------------------------------------------------------------- -- Формирование временной таблицы @tmpic ( Id, Name ) с данными -- из прикрепленной к задаче с кодом @idtask таблицы абонентов. -------------------------------------------------------------------
SET FMTONLY OFF Declare @emptyname nvarchar ( 30 ) Set @emptyname = '' Declare @hasnames bit Set @hasnames = 0 Declare @idlist uniqueidentifier Select @idlist = ListId From A_TaskManager_Tasks t where Id = @idtask if ( @idlist is null ) Set @emptyname = '<список удален>' Declare @abons table ( Id int, Name nvarchar ( 200 ) ) Declare @type int Declare @query nvarchar ( 4000 ) Declare @jtable nvarchar ( 1000 ) Declare @colname nvarchar ( 50 ) Declare @colid nvarchar ( 50 ) Select @type = Type, @query = Query, @jtable = JoinedTable, @colid = ColumnId, @colname = ColumnName From A_TaskManager_Lists Where Id = @idlist Declare @tmpic table ( Id int, Name nvarchar ( 1000 ) ) if ( Len ( @colid ) > 0 ) and ( Len ( @colname ) > 0 ) and ( not @type is null ) begin Declare @extquery nvarchar ( 4000 ) if exists ( Select * From tempdb..sysobjects Where Id = object_id ( 'tempdb..#tmpic' ) ) Drop Table #tmpic Create table #tmpic ( id int, name nvarchar ( 1000 ) ) if ( Len ( @jtable ) > 0 ) and ( @type in ( 1, 2 ) ) begin Set @extquery = 'Select ' + @colid + ' as Id, Cast ( IsNull ( ' + @colname + ', ''' + @emptyname + ''' ) as nvarchar ( 1000 ) ) as Name From ' + @jtable Insert into #tmpic Exec sp_sqlexec @extquery Set @hasnames = 1 end else if ( Len ( @query ) > 0 ) and ( @type = 3 ) begin Set @extquery = 'Select ' + @colid + ' as Id, Cast ( IsNull ( ' + @colname + ', ''' + @emptyname + ''' ) as nvarchar ( 1000 ) ) as Name From (' + @query + ')a' Insert into #tmpic Exec sp_sqlexec @extquery Set @hasnames = 1 end Insert into @tmpic Select * From #tmpic Set @emptyname = '<не найден>' Update @tmpic Set Name = @emptyname Where Name = '' Drop Table #tmpic Set @emptyname = '<не задано>' end
------------------------------------------------------------------- -- Далее можно пользоваться таблицей @tmpic с полями Id и Name -------------------------------------------------------------------