Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как заполнить временную таблицу данными из динамического запроса.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
Добрый день.

Имеется таблица, в которой хранятся имена функций, которые возвращают табличные значения. У всех функций одинаковые поля.


Читая имя функции из таблицы, как можно её вызвать и заполнить данными временную таблицу.

Смысл попробую передать через скрипт (конечно, он не рабочий)) ):
DECLARE @FunName NVARCHAR(50) = '[dbo].[main_fun]()'
DECLARE @MyTable TABLE (
  [Key] INT,
  [Name] NVARCHAR(50)
)

INSERT INTO MyTable  ([Key], [Name])
  SELECT [Key], [Name] FROM @FunName


Заранее благодарен!
13 авг 18, 14:09    [21640447]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Игорь_UUS,

INSERT INTO ... EXEC()
13 авг 18, 14:11    [21640453]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
TaPaK,

не понял, это как?

INSERT INTO @MyTable ([Key], [Name])
  SELECT [Key], [Name] FROM EXEC('SELECT [Key], [Name] FROM [dbo].[main_fun]()')


так должно получиться?
13 авг 18, 14:14    [21640462]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Игорь_UUS,

нет
13 авг 18, 14:15    [21640468]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30711
Игорь_UUS
TaPaK,

не понял, это как?
Набираете EXEC, подводите на него курсор, нажимаете F1
13 авг 18, 14:18    [21640477]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
TaPaK,

Помоги разобраться... бегло пробежался по возможностям EXEC в справке, не нашёл нужного...
13 авг 18, 14:19    [21640478]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Игорь_UUS
TaPaK,

Помоги разобраться... бегло пробежался по возможностям EXEC в справке, не нашёл нужного...
\
теперь бегите по INSERT
13 авг 18, 14:20    [21640487]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
TaPaK
Игорь_UUS
TaPaK,

Помоги разобраться... бегло пробежался по возможностям EXEC в справке, не нашёл нужного...
\
теперь бегите по INSERT


Разобрался спс!
13 авг 18, 14:24    [21640496]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
L_argo
Member

Откуда:
Сообщений: 1132
EXEC('INSERT INTO @MyTable ([Key], [Name]) SELECT [Key], [Name] FROM dbo.main_fun()')

ps: Это не временная таблица. Это табличная переменная.
13 авг 18, 14:29    [21640514]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
L_argo
EXEC('INSERT INTO @MyTable ([Key], [Name]) SELECT [Key], [Name] FROM dbo.main_fun()')

ps: Это не временная таблица. Это табличная переменная.

и что потом с этим творчеством делать? просто для красоты?
13 авг 18, 14:31    [21640518]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Игорь_UUS,

если не хотите писать IF..ELSE, напишите CLR табличную функцию, передавайте имя SQL функции. Этим должно заниматься прикладное приложение на самом деле, а не сервер БД.
13 авг 18, 14:39    [21640544]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
Скажите, а можно обойти в функции, возвращающей табличное значение:

Недопустимое использование оператора "INSERT EXEC", оказывающего побочное действие, в функции.

?

пытаюсь сделать так:
CREATE FUNCTION [dbo].[DB_DUP_GetDuplicatesInSearchPlan](
  @SearchPlanKey	INT
) RETURNS @Duplicates TABLE (
    [Key]			INT PRIMARY KEY,
    [Name]			NVARCHAR(255) NOT NULL,
    [Information]	NVARCHAR(512) NOT NULL,
    [Enabled]		BIT NOT NULL,
    [CreationDate]	DATETIME NOT NULL,
    [RowNumber]		INT NOT NULL
  )
AS
BEGIN
  DECLARE @FunctionName NVARCHAR(50) = (SELECT [FunctionName] FROM [DB_DUP_SearchPlan] WHERE [Key] = @SearchPlanKey)
  INSERT INTO @Duplicates ([Key], [Name], [Information], [Enabled], [CreationDate], [RowNumber])
    EXEC('SELECT [Key], [Name], [Information], [Enabled], [CreationDate], [RowNumber] FROM ' + @FunctionName)
  
  RETURN
END
GO
13 авг 18, 15:09    [21640621]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Игорь_UUS
а можно обойти в функции

Выбрать какую-нибудь другую СУБД.
13 авг 18, 15:11    [21640627]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
Гавриленко Сергей Алексеевич
Игорь_UUS
а можно обойти в функции

Выбрать какую-нибудь другую СУБД.



Спасибо, не вариант!))
13 авг 18, 15:13    [21640634]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Игорь_UUS
Гавриленко Сергей Алексеевич
пропущено...
Выбрать какую-нибудь другую СУБД.

Спасибо, не вариант!))
Ваша архитектура -- тоже не вариант для MSSQL.

Сообщение было отредактировано: 13 авг 18, 15:18
13 авг 18, 15:17    [21640650]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Const123
Member

Откуда:
Сообщений: 26
Гавриленко Сергей Алексеевич
Ваша архитектура -- тоже не вариант для MSSQL.

Ваши ответы напоминают фразу : "Просто ты неудачник - убей себя об стену".

ТС , действительно смотрите в сторону CLR, в ней можно спокойно "спрятать" любые динамические запросы.
Но туда возможно потребуется пробросить много лишней требухи, вроде имени пользователя и пароля и т.п. при формировании итогового запроса.
Стоит взвесить все за и против.
14 авг 18, 12:22    [21641685]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30711
Const123
Гавриленко Сергей Алексеевич
Ваша архитектура -- тоже не вариант для MSSQL.

Ваши ответы напоминают фразу : "Просто ты неудачник - убей себя об стену".

ТС , действительно смотрите в сторону CLR, в ней можно спокойно "спрятать" любые динамические запросы.
Но туда возможно потребуется пробросить много лишней требухи, вроде имени пользователя и пароля и т.п. при формировании итогового запроса.
Стоит взвесить все за и против.
Но это действительно не вариант для SQL. Это противоречит принятому в MSSQL подходу.

ТС нужно смотреть не в сторону CLR, а в сторону статической типизации используемых множеств.

И вообще, нужно постараться хоть немного поработать в команде с опытным разработчиком, так можно будет научиться азам не за год, сделав один нежизнеспособный проект в мусорную корзину, а месяца за 3.
14 авг 18, 12:33    [21641708]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

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

автор
И вообще, нужно постараться хоть немного поработать в команде с опытным разработчиком, так можно будет научиться азам не за год, сделав один нежизнеспособный проект в мусорную корзину, а месяца за 3.

судя по темам в среде sql, 2/3 "новых" разработсчиков начинают с фразы "нафиг мне писать обработку каждой сущности, сделаю ка я процедурку с динамикой и сразу утру нос всем этим поганым сеньорам"
14 авг 18, 12:37    [21641718]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Я знал человека, который 90% кода писал динамическими запросами. И этим не горжусь. :D
14 авг 18, 12:39    [21641724]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
AndrF
Member

Откуда:
Сообщений: 2183
А ведь ответ-то прост - объявление табличной переменной и дальнейшая работа с ней должна быть в той же переменной, в которую помещаете INSERT. Поместите в нее весь необходимый код и выполняйте его, если уж так хочется.
14 авг 18, 14:36    [21641932]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
AndrF
А ведь ответ-то прост - объявление табличной переменной и дальнейшая работа с ней должна быть в той же переменной, в которую помещаете INSERT. Поместите в нее весь необходимый код и выполняйте его, если уж так хочется.

в какой переменной должна быть переменная?
14 авг 18, 14:39    [21641937]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
AndrF
Member

Откуда:
Сообщений: 2183
TaPaK
в какой переменной должна быть переменная?


Что тут непонятного:

DECLARE @FunName NVARCHAR(50) = '[dbo].[main_fun]()'
DECLARE @Sql varchar(4000)

SET @Sql =
'DECLARE @MyTable TABLE (
  [Key] INT,
  [Name] NVARCHAR(50)
)

INSERT INTO @MyTable  ([Key], [Name])
  SELECT [Key], [Name] FROM dbo.' + @FunName + '

SELECT * FROM @MyTable'

EXEC (@Sql)
14 авг 18, 16:37    [21642145]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

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

1. и зачем? И всё потом в динамие писать?

2.
а так нельзя?

INSERT INTO @MyTable ([Key], [Name])
  EXEC('SELECT [Key], [Name] FROM [dbo].[main_fun]()')


3.
непонятно ваши бредовые ассоциации или скорее не понимаение работы
автор
объявление табличной переменной и дальнейшая работа с ней должна быть в той же переменной,
14 авг 18, 16:41    [21642151]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
AndrF
Member

Откуда:
Сообщений: 2183
TaPaK
AndrF,

1. и зачем? И всё потом в динамие писать?


Напишите иначе.

TaPaK
2.
а так нельзя?

INSERT INTO @MyTable ([Key], [Name])
  EXEC('SELECT [Key], [Name] FROM [dbo].[main_fun]()')


3.
непонятно ваши бредовые ассоциации или скорее не понимаение работы


Блин, да вы хоть прочтите то с чего все началось - внимательно и по слогам, перед тем как строчить.

Имена функций у автора вопроса хранятся в таблице (не спрашивайте меня почему - считаем что так надо). Их надо подставлять в запрос.

Теперь, вместо того чтобы не вдумываясь писать о бреде - покажите свое решение того что он хочет получить в итоге.
14 авг 18, 16:48    [21642160]     Ответить | Цитировать Сообщить модератору
 Re: Как заполнить временную таблицу данными из динамического запроса.  [new]
TaPaK
Member

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

ну раз вы не сразу понимаете, то вот

DECLARE @FunName NVARCHAR(50) = '[dbo].[main_fun]()'
DECLARE @Sql varchar(4000)
SET @Sql = 'SELECT [Key], [Name] FROM dbo.' + @FunName 

INSERT INTO @MyTable ([Key], [Name])
  EXEC(@sql)
14 авг 18, 16:51    [21642162]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить