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

Откуда: Санкт-Петербург
Сообщений: 989
Имеется скалярная пользовательская функция, в которой я пишу такой код:

ALTER FUNCTION dbo.myfunc
(
@query_part nvarchar(max)
)
RETURNS int
AS
BEGIN

declare @Cnt int
declare @SQL nvarchar(max)

set @SQL = N'select count(*) from tb where ' +@query_part
exec sp_executesql @SQL

return @Cnt
END

Как мне синтаксически так написать, чтобы вернуть в @Cnt значение кол-ва строк в таблице tb, чтобы функция его вернула как результат?
31 июл 09, 17:12    [7485932]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
динамический SQL - зло
возможно, Вам будет достаточно прочесть статью Переменное число критериев отбора в запросе
31 июл 09, 17:16    [7485956]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
verter
Имеется скалярная пользовательская функция, в которой я пишу такой код:

ALTER FUNCTION dbo.myfunc
(
@query_part nvarchar(max)
)
RETURNS int
AS
BEGIN

declare @Cnt int
declare @SQL nvarchar(max)

set @SQL = N'select count(*) from tb where ' +@query_part
exec sp_executesql @SQL

return @Cnt
END

Как мне синтаксически так написать, чтобы вернуть в @Cnt значение кол-ва строк в таблице tb, чтобы функция его вернула как результат?
В функции - никак.
31 июл 09, 17:17    [7485972]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 989
может быть создать процедуру и её вызвать в функции?

ALTER PROCEDURE dbo.myproc
(
@query_part nvarchar(max) in, @cnt_out out
)
AS
BEGIN

declare @Cnt int
declare @SQL nvarchar(max)

set @SQL = 'set @Cnt = (select count(*) from tb where ' +@query_part+')'
exec sp_executesql @SQL, '@Cnt int out', @Cnt = @Cnt out

select @cnt_out=@Cnt

END


ALTER FUNCTION dbo.myfunc
(
@query_part nvarchar(max)
)
RETURNS int
AS
BEGIN
declare @cnt_out int
exec myproc(@query_part,@cnt_out)

RETURN @cnt_out
END
31 июл 09, 17:32    [7486058]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
verter
может быть создать процедуру и её вызвать в функции?
Может, перед тем, как генерить идеи одна другой краше, все-таки прочитать документацию на тему, что можно делать в функции, а чего нельзя?
31 июл 09, 17:35    [7486078]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
verter
может быть создать процедуру и её вызвать в функции?

Это тоже невозможно. И задокументировано, как и все остальные ограничения функций
31 июл 09, 17:36    [7486084]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 989
как же тогда быть? Я использую эту функцию в запросе для получения кол-ва строк и передаю в функцию имя временной таблицы, чтобы потом в функции сформировать запрос к ней, выполнить его и получить кол-во
31 июл 09, 17:39    [7486105]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
verter
как же тогда быть?

Сначала читать про ограничения. Потом придумывать алгоритм. А не наоборот
31 июл 09, 17:41    [7486118]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 989
я просто раньше на оракле писал, там не было ограничений
31 июл 09, 17:42    [7486124]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
verter
я просто раньше на оракле писал, там не было ограничений

А здесь есть. И ваш опыт оракла скорее помешает, чем поможет вам
31 июл 09, 17:48    [7486154]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
vino
Member

Откуда:
Сообщений: 1191
verter, возможно, поможет это
31 июл 09, 18:12    [7486263]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
vino
Member

Откуда:
Сообщений: 1191
или вот это[/quot]
31 июл 09, 18:14    [7486269]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 629
Хоть динамический SQL - зло, но бывают моменты когда трудно от них избавиться - особенно когда не свою систему дорабатываешь...

Как вариант в динамическом SQL попробовать сделать
Select ... into #tmp from...
а потом работать с темповой таблицей... Не знаю точно как микрософт, а сайбез такие "вольности" позволяет 100%
31 июл 09, 21:58    [7486713]     Ответить | Цитировать Сообщить модератору
 Re: динамический SQL в функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Mikle83
Хоть динамический SQL - зло, но бывают моменты когда трудно от них избавиться - особенно когда не свою систему дорабатываешь...

Как вариант в динамическом SQL попробовать сделать
Select ... into #tmp from...
а потом работать с темповой таблицей... Не знаю точно как микрософт, а сайбез такие "вольности" позволяет 100%
Ну блин, ну прочитайте хелп, там английским по белому написано, что можно, что нельзя. И не надо сайбейзы и ораклы тут приплетать.
31 июл 09, 23:21    [7486937]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить