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

Откуда:
Сообщений: 566
Добрый день!
Возможно ли как то обойти проблему использования динамического запроса в процедуре, если запрос выдает только табличные данные. У меня вот такой запрос, необходимо вернуть таблицу. Можно конечно попробовать через временную таблицу, но таблицы разные, количество столбцов неизвестно. Возможно ли как исхитриться, что-то отправить в функцию, что-то оставить в процедуре. Подскажите, пожалуйста.
ALTER PROCEDURE [dbo].[Table]
	@Task nvarchar(max),
	@Table nvarchar(max)
AS
BEGIN
	Declare @SQL nvarchar(max)
	Declare @TableID nvarchar(max)
exec sp_executesql 
N'Select @TableID=(Select top(1)ID from _Tables Where Name like @Table AND TaskID=(Select top(1)ID from _Task Where Name=@Task))', 
N'@TableID nvarchar(max) OUTPUT,@Task nvarchar(max),@Table nvarchar(max)',
@TableID OUTPUT,@Task,@Table
Set @SQL='SELECT * FROM ['+ @TableID+']'
exec sp_executesql @SQL
Return
END
11 авг 17, 09:49    [20715546]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
aleks222
Guest
Lexx_SQL
Добрый день!
Возможно ли как то обойти проблему использования динамического запроса в процедуре, если запрос выдает только табличные данные. У меня вот такой запрос, необходимо вернуть таблицу. Можно конечно попробовать через временную таблицу, но таблицы разные, количество столбцов неизвестно. Возможно ли как исхитриться, что-то отправить в функцию, что-то оставить в процедуре. Подскажите, пожалуйста.
ALTER PROCEDURE [dbo].[Table]
	@Task nvarchar(max),
	@Table nvarchar(max)
AS
BEGIN
	Declare @SQL nvarchar(max)
	Declare @TableID nvarchar(max)
exec sp_executesql 
N'Select @TableID=(Select top(1)ID from _Tables Where Name like @Table AND TaskID=(Select top(1)ID from _Task Where Name=@Task))', 
N'@TableID nvarchar(max) OUTPUT,@Task nvarchar(max),@Table nvarchar(max)',
@TableID OUTPUT,@Task,@Table
Set @SQL='SELECT * FROM ['+ @TableID+']'
exec sp_executesql @SQL
Return
END


Советую медитировать не тему: "а нахрена козе баян вам таблица неизвестного содержания?"
11 авг 17, 10:05    [20715625]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
Lexx_SQL
Member

Откуда:
Сообщений: 566
aleks222,
У меня БД, где таблицы с данными создаются динамически и именуются номером по порядку , а наименование таблицы лежит в общей таблице.
Поэтому чтобы узнать в какой таблице хранятся данные, я сначала обращаюсь в общую таблицу, ищу имя и номер, и потом по номеру должен находить искомую таблицу и выводить данные. Для удобства хотелось бы сделать процедуру, где просто указывалась бы наименование таблицы, например, Proc('ТаблицаОстатков'), а процедура бы возвращала select этой таблицы
11 авг 17, 10:12    [20715663]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Lexx_SQL,

ваш удел вечно страдать в динамике и все остальные будут страдать вместе с вашей гениальной идеей
11 авг 17, 10:15    [20715682]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
правильнй проходящий.
Guest
Lexx_SQL,

с точки зрения разработки баз данных вы занимаетесь одеванием штанов через голову.
Используемый вами подход был пригоден в настольных файловых бд для поделок на коленке и совершенно чужд серьезным субд.
11 авг 17, 10:26    [20715723]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
Lexx_SQL
Member

Откуда:
Сообщений: 566
правильнй проходящий.,
с точки зрения разработки БД нужно хотя бы представлять для какой задачи она создается и как будет работать. Если советов по делу нет, то можно не писать в чате. Чат создан для решения проблемы , а не хаяния....
11 авг 17, 10:30    [20715747]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
aleks222
Guest
Lexx_SQL
правильнй проходящий.,
с точки зрения разработки БД нужно хотя бы представлять для какой задачи она создается и как будет работать. Если советов по делу нет, то можно не писать в чате. Чат создан для решения проблемы , а не хаяния....


Проблемы не в сортирах - проблемы в головах.

Вы излагаете как детсадовец ясельной группы:
Lexx_SQL
Добрый день!
У меня вот такой запрос, необходимо вернуть таблицу.

Ну дык ваш запрос и возвращает таблицу.

Lexx_SQL
Добрый день!
Можно конечно попробовать через временную таблицу, но таблицы разные, количество столбцов неизвестно.

Нафига вам временная таблица?

Lexx_SQL
Добрый день!
Возможно ли как исхитриться, что-то отправить в функцию, что-то оставить в процедуре.

Кто на ком стоял и чем вы недовольны?
11 авг 17, 10:38    [20715786]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7768
Lexx_SQL,

так расскажите, для чего сея нереляционная архитектура на реляционном движке. Не, ну велосипедом тоже можно ямы копать, кто же спорит.
11 авг 17, 11:15    [20716032]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
правильный проходящий.
Guest
Lexx_SQL
с точки зрения разработки БД нужно хотя бы представлять для какой задачи она создается и как будет работать.
Микроскопом можно забивать гвозди, но, почему-то это считается идиотизмом вне зависимости от того, куда надо забить гвоздь.
Если советов по делу нет,
А где тут дело? Очередная гениальная попытка работать с данными неизвестной структуры?
то можно не писать в чате.
Во-первых, не вам решать и указывать кому и что делать, во вторых - это не чат.
Чат создан для решения проблемы ,
В-третьих, ваши представления о назначении форумов сильно отличаются от действительности. Тут никто не подписивылася решать ваши проблемы, которые, к тому же, вытекают из выбранного вами идиотского способа решения.
а не хаяния....
И, в четвертых, уж всяко не предназначены для демонстрации своей сверхтонкой душевной организации, впадающей в бабскую истерику и видящей хаяние в простой констатации факта.
11 авг 17, 11:18    [20716057]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Lexx_SQL,

по сути изначального вопроса:
- T-SQL функции не поддерживают dynamic SQL и это не обойти. Т.е. в них ни EXEC, ни изменение данных , ни даже PRINT не разрешены.
- можно извратиться и слепить внешнюю Table-Value UDF на .NET, которая будет осуществлять всю динамику.
Но и здесь ограничение - сигнатура возвращаемого Row-Set должна быть предопределена.
11 авг 17, 11:46    [20716197]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
дополню ...

Вообще постановка задачи попахивает внешним контролем, т.е. вызываться такое будет не внутри самого MSSQL (к примеру из другой процедуры), а извне.
И тут, как коллеги, грубо, но верно упомянули, что задача должна решаться другими средствами.
Я лично взял бы какой ETL инструмент - SSIS или Pentaho Data Integration (мой любимый) или еще чего.
Или, на худой конец, написал какую утилитку на C#
11 авг 17, 11:51    [20716223]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
по сабжу: в основном коде ссылайтесь на VIEW где select * from xxxx
Перед выполнением процедуры достаточно пересоздать вью с нужным именем таблицы хххх.

коряво конеш, но в ряде случаев покатит... :)
11 авг 17, 12:34    [20716393]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
iii2
Member

Откуда:
Сообщений: 202
LSV
по сабжу: в основном коде ссылайтесь на VIEW где select * from xxxx
Перед выполнением процедуры достаточно пересоздать вью с нужным именем таблицы хххх.

коряво конеш, но в ряде случаев покатит... :)

Ага. И для конкретного пользователя. Даже для конкретного сеанса конкретного пользователя.
11 авг 17, 12:42    [20716432]     Ответить | Цитировать Сообщить модератору
 Re: Select в динамическом запросе и процедура  [new]
Lexx_SQL
Member

Откуда:
Сообщений: 566
Про динамические запросы я в курсе. Вопрос был как можно было обойти используя SQL или только программно.
Спасибо всем кто написал по делу.
14 авг 17, 14:28    [20721962]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить