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

Откуда:
Сообщений: 107
Доброго времени суток. Необходимо выполнить RETURN динамически составленного запроса. Подскажите пожалуйста есть ли возможность это сделать без временной таблици и без выборки из табличной переменной. Если да то покажите пожалуйста пример. Спасибо за ответы.
8 июн 11, 16:09    [10784108]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
https://www.sql.ru/faq/faq_topic.aspx?fid=104 , пункт 3.
8 июн 11, 16:11    [10784128]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
bloodrain
Member

Откуда:
Сообщений: 107
Гавриленко Сергей Алексеевич
https://www.sql.ru/faq/faq_topic.aspx?fid=104 , пункт 3.

Делаю так:
declare @a table( i int )
declare @m_sql nvarchar(50) = ' insert into @a select 1 as i union all select 2 as i'
exec sp_executesql @m_sql, N'@a table( i int ) out', @a = @a out
select i from @a
Получаю
автор
Сообщение 156, уровень 15, состояние 1, строка 1
Неправильный синтаксис около ключевого слова "table".
Сообщение 1087, уровень 15, состояние 2, строка 1
Необходимо объявить табличную переменную "@a".

(строк обработано: 0)



Что я сделал не так?
8 июн 11, 17:34    [10784997]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А где там написано, что табличные переменные можно возвращать?
8 июн 11, 17:36    [10785010]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
invm
Member

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

declare @a table( i int )
declare @m_sql nvarchar(50) = 'select 1 as i union all select 2 as i'
insert into @a(i)
 exec(@m_sql)
select i from @a
8 июн 11, 17:39    [10785031]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
bloodrain
Member

Откуда:
Сообщений: 107
Но проблема даже в том что при попытке вызова функции пишет
"Сообщение 557, уровень 16, состояние 2, строка 1
Внутри функции можно вызывать только функции и некоторые расширенные хранимые процедуры."

Насколько я понимаю это об sp_executesql, ибо другого ничего не вызывается
8 июн 11, 17:39    [10785035]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bloodrain
Насколько я понимаю это об sp_executesql, ибо другого ничего не вызывается
Да.
8 июн 11, 17:40    [10785055]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
bloodrain
Member

Откуда:
Сообщений: 107
Гавриленко Сергей Алексеевич
bloodrain
Насколько я понимаю это об sp_executesql, ибо другого ничего не вызывается
Да.


Есть ли решения для табличных переменных?
8 июн 11, 17:41    [10785058]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bloodrain
Есть ли решения для табличных переменных?
Решения чего?
8 июн 11, 17:42    [10785071]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
bloodrain
Member

Откуда:
Сообщений: 107
Гавриленко Сергей Алексеевич
bloodrain
Есть ли решения для табличных переменных?
Решения чего?


Вернуть таблицу из функции возвращающей табличное значения используя динамический sql
8 июн 11, 17:44    [10785087]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bloodrain
Вернуть таблицу из функции возвращающей табличное значения используя динамический sql
Динамический sql в функции использовать не получится.
8 июн 11, 17:45    [10785102]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
bloodrain
Member

Откуда:
Сообщений: 107
Гавриленко Сергей Алексеевич,

Я понял, спасибо, если вас не затруднит то ткните носом в доку пожалуйста.
8 июн 11, 17:48    [10785124]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bloodrain
Гавриленко Сергей Алексеевич,

Я понял, спасибо, если вас не затруднит то ткните носом в доку пожалуйста.
В разделе create function английским (и даже русским) по белому написано, что можно использовать в теле функции, а чего нет.
8 июн 11, 17:50    [10785143]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
bloodrain
Member

Откуда:
Сообщений: 107
Гавриленко Сергей Алексеевич
bloodrain
Гавриленко Сергей Алексеевич,

Я понял, спасибо, если вас не затруднит то ткните носом в доку пожалуйста.
В разделе create function английским (и даже русским) по белому написано, что можно использовать в теле функции, а чего нет.


Ну вот потому и прошу. Ибо
http://msdn.microsoft.com/en-us/library/ms186755.aspx

В разделе Limitations and Restrictions
Пишут:
автор
User-defined functions cannot be used to perform actions that modify the database state.

User-defined functions cannot contain an OUTPUT INTO clause that has a table as its target.

The following Service Broker statements cannot be included in the definition of a Transact-SQL user-defined function:

BEGIN DIALOG CONVERSATION

END CONVERSATION

GET CONVERSATION GROUP

MOVE CONVERSATION

RECEIVE

SEND

User-defined functions can be nested; that is, one user-defined function can call another. The nesting level is incremented when the called function starts execution, and decremented when the called function finishes execution. User-defined functions can be nested up to 32 levels. Exceeding the maximum levels of nesting causes the whole calling function chain to fail. Any reference to managed code from a Transact-SQL user-defined function counts as one level against the 32-level nesting limit. Methods invoked from within managed code do not count against this limit.


Может я плохо смотрю, но про dsql ничего не вижу.
8 июн 11, 18:03    [10785268]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Выше
The following statements are valid in a function:
8 июн 11, 18:09    [10785304]     Ответить | Цитировать Сообщить модератору
 Re: dsql и возврат табличной функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bloodrain
Может я плохо смотрю, но про dsql ничего не вижу.

Правильно, его там и нет:

http://msdn.microsoft.com/en-us/library/ms186755.aspx
The following statements are valid in a function:

  • Assignment statements.

  • Control-of-Flow statements except TRY...CATCH statements.

  • DECLARE statements defining local data variables and local cursors.

  • SELECT statements that contain select lists with expressions that assign values to local variables.

  • Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.

  • INSERT, UPDATE, and DELETE statements modifying local table variables.

  • EXECUTE statements calling extended stored procedures.



  • Сообщение было отредактировано: 8 июн 11, 18:10
    8 июн 11, 18:10    [10785308]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить