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

Откуда:
Сообщений: 413
Условие задачи: Есть необходимость сгенерировать выражение SQL из различных переменных. В переменные входят:
- имя таблицы
- имя столбца
- значение столбца
Которое потом запускается с помощью exec sp_executesql. Это должно возвратить выборку.
Пример
declare @sql nvarchar(max),@Prm nvarchar(max), @tablename varchar(100), @columnname varchar(100), @columnvalue varchar(100)
set @tablename = 'master.dbo.spt_values'
set @columnname= 'type'
set @columnvalue = '''A'''
SET @Sql = 'select * from ' + @tablename + ' where ' + @columnname + ' = ' + @columnvalue
SET @Prm = ''
exec sp_executesql @Sql, @Prm

Есть ли какой-то хитрый способ реализовать это в функции, что бы в дальнейшем можно было пользоваться Select * from dbo.func (tablename, columnname,columnvalue)?

пробовал оформить вышеописанное в виде хранимки и вписать внутрь функции с табличным возвращаемым значением - на меня SMSS ругнулось конечно, мол только некоторым хранимкам разрешено бывать внутри функции.

Еще можно конечно оформить в виде хранимки и в качестве выходного параметра указать какую-нить таблицу и из нее выбирать. Но хотелось бы через что-то, что не потребует дополнительных declare table. а просто select * from dbo.func().

Спасибо.
10 ноя 11, 19:19    [11577928]     Ответить | Цитировать Сообщить модератору
 Re: результирующи набор из Exec sp_executesql в таблицу. Можно?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
notricky
Есть ли какой-то хитрый способ реализовать это в функции

нет

notricky
Еще можно конечно оформить в виде хранимки

    INSERT  INTO ...  EXEC ...
но есть некоторые ограничения на вложенность
10 ноя 11, 20:28    [11578099]     Ответить | Цитировать Сообщить модератору
 Re: результирующи набор из Exec sp_executesql в таблицу. Можно?  [new]
openrowset
Guest
notricky,

openrowset
10 ноя 11, 23:10    [11578489]     Ответить | Цитировать Сообщить модератору
 Re: результирующи набор из Exec sp_executesql в таблицу. Можно?  [new]
notricky
Member

Откуда:
Сообщений: 413
kDnZP
notricky
Есть ли какой-то хитрый способ реализовать это в функции

нет

notricky
Еще можно конечно оформить в виде хранимки

    INSERT  INTO ...  EXEC ...
но есть некоторые ограничения на вложенность

А какие?
К тому же, как я понимаю, все равно такую конструкцию не запихнуть в функцию.

Быть может есть способ не использовать sp_executesql, но при этом собирать запрос по частям?
11 ноя 11, 11:35    [11580214]     Ответить | Цитировать Сообщить модератору
 Re: результирующи набор из Exec sp_executesql в таблицу. Можно?  [new]
notricky
Member

Откуда:
Сообщений: 413
То есть у меня в БД есть несколько таблиц, в которых разные типы данных, но из каждой строится отдельное дерево.
Означает ли это, что для каждый таблицы надо будет написать по отдельной функции, получающей дерево или универсализировать все-таки можно (кроме openrowset - имхо чрезчур)?
11 ноя 11, 11:39    [11580247]     Ответить | Цитировать Сообщить модератору
 Re: результирующи набор из Exec sp_executesql в таблицу. Можно?  [new]
Art-C0de_NoPassword
Guest
погуглите тему иерархических запросов
в Oracle это делается connect by prior

вот, за 5 мин. нагуглил обсуждение темы
MS SQL 2008: hierarchyid
Hierarchical Queries in SQL Server 2005
Иерархические (рекурсивные) запросы


А чтобы из функций можно было динамически обращаться к любым источникам данных
(хоть к Excel, хоть к Oracle, да чему угодно) я написал XP_Get_Remote_Rows.dll
- можете ее установить или самостоятельно CLR аналогичного назначения напишите.
12 ноя 11, 23:04    [11587828]     Ответить | Цитировать Сообщить модератору
 Re: результирующи набор из Exec sp_executesql в таблицу. Можно?  [new]
bebop
Member

Откуда:
Сообщений: 120
notricky

Еще можно конечно оформить в виде хранимки и в качестве выходного параметра указать какую-нить таблицу и из нее выбирать. Но хотелось бы через что-то, что не потребует дополнительных declare table. а просто select * from dbo.func().

Спасибо.


А зачем делать декларе тэйбыл? Если внутри хранимки использовать конструкцию SELECT INTO, то таблица без всяких declare создастся.

Можно глобальными временными таблицами воспользоваться если дропать постоянные лень.

Ну и конечно есть вопрос зачем вся эта конструкция нужна - не хватает объектно-ориентированности в транзакте ? ;)
14 ноя 11, 19:31    [11595949]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить