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

Откуда: СПб
Сообщений: 270
Всем добрый день!

В документации Microsoft написано:

CREATE FUNCTION (Transact-SQL)

Создает определяемую пользователем функцию в SQL Server 2008 R2. Определяемая пользователем функция, представляющая собой подпрограмму Transact-SQL или среды CLR, которая принимает параметры, выполняет действия, такие как сложные вычисления, а затем возвращает результат этих действий в виде значения. Возвращаемое значение может быть скалярным значением или таблицей. При помощи этой инструкции можно создать подпрограмму, которую можно повторно использовать следующими способами.

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

    Я пытаюсь ее использовать вот в таком выражении:

    SELECT * FROM (SELECT dbo.Devices.KKS, dbo.sys_cabStencil.CONNECTION, dbo.sys_cabStencil.[ORDER], 'CAB' + CAST(CABLE as VARCHAR(2)) AS CAB, dbo.sys_cabStencil.SIGNAL
                                    FROM dbo.sys_cabStencil INNER JOIN dbo.Devices
                                    ON dbo.sys_cabStencil.CONNECTION = dbo.Devices.АЛГОРИТМ
                                    WHERE KKS = '4FBC42AP001') pvt
                                    PIVOT (Min(SIGNAL) FOR CAB IN (dbo.fn_Get_PivotIN('4FBC42AP001'))) AS Child
    


    Но получаю такую ошибку:
    Сообщение 102, уровень 15, состояние 1, строка 5
    Incorrect syntax near '('.

    Подскажите как правильно сделать?
  • 9 янв 13, 14:29    [13741433]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Веткин Сергей

    Подскажите как правильно сделать?

    Вы нарушаете синтаксис PIVOT

    FOR
    [<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column], ... [last pivoted column])
    9 янв 13, 14:33    [13741462]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    vso
    Member

    Откуда: СПб
    Сообщений: 270
    Но результат выполнения функции соответствует синтаксису PIVOT
    9 янв 13, 14:35    [13741490]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Веткин Сергей
    Но результат выполнения функции соответствует синтаксису PIVOT

    А где в синтаксисе PIVOT указано, что команда будет для FOR использовать результат функции ?
    9 янв 13, 14:37    [13741507]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    vso
    Member

    Откуда: СПб
    Сообщений: 270
    Дело в том что я не уверен что он ругается на скобку при IN, т.к. на картинке видно что сам SSMS подчеркивает скобку при функции.

    К сообщению приложен файл. Размер - 131Kb
    9 янв 13, 14:58    [13741718]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Веткин Сергей
    Дело в том что я не уверен что он ругается на скобку при IN, т.к. на картинке видно что сам SSMS подчеркивает скобку при функции.

    Вы внимательно прочитали синтаксис PIVOT ?

    FOR
    [<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column], ... [last pivoted column])
    Почему вы решили, что[first pivoted column], [second pivoted column],... - это может быть результат какой-то функции/запроса ?
    9 янв 13, 15:00    [13741741]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    vso
    Member

    Откуда: СПб
    Сообщений: 270
    Сдаюсь, а как хотелось, чтобы это была правда
    9 янв 13, 15:20    [13741889]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    через зад
    Guest
    Веткин Сергей,

    если очень хочется через зад, то заранее считаем, что вернет функция и
    собираем запрос динамически
    9 янв 13, 15:29    [13741981]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    vso
    Member

    Откуда: СПб
    Сообщений: 270
    так это и была попытка уйти от динамического sql

    Подскажи еще, а есть возможность такого синтаксиса:

    SELECT * FROM [Встроенная Процедура](параметр)??????????
    9 янв 13, 15:40    [13742085]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    через зад
    Guest
    нЭт.
    результат процедуры можно сохранить в таблицу: INSERT.. EXEC...
    и потом из нее селектить.
    9 янв 13, 15:46    [13742123]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    через зад
    Guest
    а вообще вот это [Встроенная Процедура](параметр)
    наводит на мысль о функции.
    из табличной функции ага, селектят, это как view с параметрами.
    а у процедуры параметры без скобок
    9 янв 13, 15:48    [13742144]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    vso
    Member

    Откуда: СПб
    Сообщений: 270
    Может тогда кто подскажет как из Delphi можно выполнить динамический SQL????
    9 янв 13, 16:08    [13742315]     Ответить | Цитировать Сообщить модератору
     Re: Функция определяемая пользователем  [new]
    через зад
    Guest
    наверное стОит спросить в дельфийском форуме
    9 янв 13, 17:22    [13742968]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить