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

Откуда:
Сообщений: 13
Приветствую! Использую функцию, возвращающую таблицу

ALTER FUNCTION [dbo].[Test1] 
( @sql nvarchar(1000),
)

RETURNS @test TABLE 
(pole1 varchar(50), pole2 varchar(50))
AS
Begin
Select pole1 , pole2 from test where .....здесь должен быть фильтр @sql
end


Как динамически добавить фильтр @sql?
11 дек 14, 17:38    [16984919]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Никак.
11 дек 14, 17:38    [16984923]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
Axeleron
Member

Откуда: London
Сообщений: 7531
lexmove,

Сделайте весь запрос, включая фильтр, динамическим.
11 дек 14, 17:42    [16984936]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
lexmove
Member

Откуда:
Сообщений: 13
Axeleron, типа использовать потом execute? А это вернет мне нужную структуру таблицы?
11 дек 14, 17:46    [16984957]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
declare @v varchar(max), @where varchar(200) = 'where ....'

set @v = concat( 'Select pole1 , pole2 from test ', @where )
exec (@v)
11 дек 14, 17:53    [16984992]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Владислав Колосов
declare @v varchar(max), @where varchar(200) = 'where ....'

set @v = concat( 'Select pole1 , pole2 from test ', @where )
exec (@v)

Axeleron
lexmove,

Сделайте весь запрос, включая фильтр, динамическим.
Не получится.
11 дек 14, 19:39    [16985421]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
lexmove
Приветствую! Использую функцию, возвращающую таблицу

ALTER FUNCTION [dbo].[Test1] 
( @sql nvarchar(1000),
)

RETURNS @test TABLE 
(pole1 varchar(50), pole2 varchar(50))
AS
Begin
Select pole1 , pole2 from test where .....здесь должен быть фильтр @sql
end


Как динамически добавить фильтр @sql?


Обычно пишут так:

SELECT * FROM T
WHERE
(@Param1 IS NULL OR T.X = @Param1) AND
(@Param2 IS NULL OR T.Y = @Param2) AND
(@Param3 IS NULL OR T.Z LIKE @Param3) ...

И так динамически подставляют параметры (NULL или конкретное значение )
11 дек 14, 19:52    [16985451]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
a_voronin,

Вредные советы?
11 дек 14, 20:01    [16985468]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Ken@t
a_voronin,

Вредные советы?


Собирайте запрос динамически с помощью LINQ .
11 дек 14, 20:04    [16985478]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
Axeleron
Member

Откуда: London
Сообщений: 7531
alexeyvg
Владислав Колосов
declare @v varchar(max), @where varchar(200) = 'where ....'

set @v = concat( 'Select pole1 , pole2 from test ', @where )
exec (@v)

Axeleron
lexmove,

Сделайте весь запрос, включая фильтр, динамическим.
Не получится.


Точно, это же функция...
11 дек 14, 20:21    [16985532]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Axeleron
alexeyvg
пропущено...

пропущено...
Не получится.


Точно, это же функция...
Ага.
Абстрактный sql подставить нельзя. Либо как a_voronin сказал (ну или другие варианты, типа собирать с UNION ALL), но это всё не для абсрактного условия в виде строки sql
Либо отказаться от функции.
Либо получать данные в функции, а условия в динамическом SQL накладывать снаружи, там, где эта функция используется.
11 дек 14, 20:25    [16985550]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
alexeyvg
Axeleron
пропущено...
Точно, это же функция...
Ага.
Абстрактный sql подставить нельзя. Либо как a_voronin сказал (ну или другие варианты, типа собирать с UNION ALL), но это всё не для абсрактного условия в виде строки sql
Либо отказаться от функции.
Либо получать данные в функции, а условия в динамическом SQL накладывать снаружи, там, где эта функция используется.
Либо ТС не понимает, что такое функции, чем они отличаются от процедур, и на самом деле ему нужна процедура.
11 дек 14, 20:27    [16985555]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7871
exec (@v)

Копетан как бы намекает, что надо отказаться от идеи функции.
12 дек 14, 12:47    [16988203]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
VRafael
Member

Откуда: Москва
Сообщений: 65
lexmove
Насколько я понял, для твоего случая подходит процедура sp_executesql
Пример использования легко найти в BOL
15 дек 14, 13:29    [16998521]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить