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

Откуда:
Сообщений: 121
Добрый день!
Есть функция, которая возвращает результат в виде таблицы:

RETURNS @result TABLE (
	DATE DATE,
	NAME NVARCHAR(255),
	OLD_VAL NVARCHAR(255),
	NEW_VAL NVARCHAR(255),
	AUTHOR NVARCHAR(255)
	)


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

Что-то наподобие этого, только я не пойму как это правильно сделать...

SET @SQLInsertTable1 = 
    'INSERT INTO ' + @result +'(DATE,NAME,OLD_VAL,NEW_VAL,AUTHOR)
(SELECT AUDIT_TIME1, NAME, C_CPU, C_CPU, AUDIT_USER FROM ' +@TableName+')';
EXEC @SQLInsertTable1;

В этом случае не видит переменную возвращаемой таблицы
Must declare the scalar variable "@result".


А если так, то переменная, содержащая имя, должна быть таблицей...
INSERT INTO @result(DATE,NAME,OLD_VAL,NEW_VAL,AUTHOR)
(SELECT AUDIT_TIME1, NAME, C_CPU, C_CPU, AUDIT_USER FROM @TableName)

Must declare the table variable "@TableName"


Возможно ли вообще такое реализовать?
14 ноя 14, 16:00    [16847418]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
что-то вы намудрили. давайте заново всю задачу опишите, что вам надо сдедать, а уж как делать тут подскажут. и для начала код вашей ф-ии привидите здесь
14 ноя 14, 16:03    [16847452]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
В функциях запрещены динамические запросы
14 ноя 14, 16:03    [16847453]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
hitmanzero,

функция не может создавать таблицу, вставлять в таблицу что-либо и выполнять динамический SQL
Всё-таки, надо начинать с документации по функциям TSQL, например
14 ноя 14, 16:05    [16847481]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
Функция ещё не написана, пока только наброски.

Чтобы её написать, нужно сначала решить примерно такую задачу:
Нужно как-то создать временную таблицу, причем заранее неизвестно сколько там будет столбцов.
Их количество зависит от входного параметра.
Например 'Device' - 40 столбцов, 'InformationFlow' - 50. Значений могут быть сотни, каждое не отловишь.
Далее нужно заполнить её запросом из таблицы, имя которой содержится в переменной (также зависящей от входного параметра). Потом с ней будут происходить некоторые манипуляции и какие то записи из этой таблицы попадут в возвращаемую функцией таблицу.

Примерно так.
14 ноя 14, 16:14    [16847546]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
hitmanzero
Потом с ней будут происходить некоторые манипуляции

А как можно манипулировать с таблицей, для которой неизвестно число полей ?
14 ноя 14, 16:17    [16847572]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
hitmanzero,

выше сказали, что функция не умеет работать с динамикой. Нужна процедура и коль Вам не известно на сколько столбцов нужно создать временную таблицу, то делайте динамику на основании мета данных или используйте конструкцию
Select ... INTO From...
14 ноя 14, 16:19    [16847591]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
hitmanzero
Функция ещё не написана, пока только наброски.

Чтобы её написать, нужно сначала решить примерно такую задачу:
Нужно как-то создать временную таблицу, причем заранее неизвестно сколько там будет столбцов.
Их количество зависит от входного параметра.
Например 'Device' - 40 столбцов, 'InformationFlow' - 50. Значений могут быть сотни, каждое не отловишь.
Далее нужно заполнить её запросом из таблицы, имя которой содержится в переменной (также зависящей от входного параметра). Потом с ней будут происходить некоторые манипуляции и какие то записи из этой таблицы попадут в возвращаемую функцией таблицу.

Примерно так.


бред какой-то. если вам действительно такое нужно, то вам дорога в динамический sql , который будет в некой ХП, а вызывать её через sp_executesql с параметрами
14 ноя 14, 16:19    [16847599]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
Glory
hitmanzero
Потом с ней будут происходить некоторые манипуляции

А как можно манипулировать с таблицей, для которой неизвестно число полей ?



Дальше в этой таблице будет сравниваться каждая строка со следующей на различия в каждом столбце. Там неважно их количество.
14 ноя 14, 16:22    [16847624]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
hitmanzero
Дальше в этой таблице будет сравниваться каждая строка со следующей на различия в каждом столбце. Там неважно их количество.

И как же вы сравните строки, если вы не знаете, сколько у вас столбцов ?
14 ноя 14, 16:23    [16847634]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
Glory
hitmanzero
Дальше в этой таблице будет сравниваться каждая строка со следующей на различия в каждом столбце. Там неважно их количество.

И как же вы сравните строки, если вы не знаете, сколько у вас столбцов ?


видимо тоже динамически

+
весёлые сегодня собщения на форуме
14 ноя 14, 16:24    [16847643]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
Будут сравниваться все столбцы у каждый двух строк. 1 с 1ым ... n с n-ым
14 ноя 14, 16:26    [16847657]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
hitmanzero
Будут сравниваться все столбцы у каждый двух строк. 1 с 1ым ... n с n-ым

Омг
Как ? Приведите код сравнения двух записей таблицы неизвестной структуры.
14 ноя 14, 16:27    [16847664]     Ответить | Цитировать Сообщить модератору
 Re: Динамический insert в функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
автор
причем заранее неизвестно сколько там будет столбцов


Реляционные базы не конструируют с заранее неизвестной структурой данных.
14 ноя 14, 16:47    [16847806]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить