Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вставка результата функции (table-valued) в таблицу / 25 сообщений из 25, страница 1 из 1
04.07.2002, 11:14:58
    #32035102
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Есть UDF. Такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create function f1(
	@p1		tinyint,
	@p2		nvarchar( 255 ),
	@p3		nvarchar( 255 )
)
returns @res table(
	r1	int,
	r2	nvarchar( 255 ),
	r3	int
)
as
begin
 -- some code
 
end


Есть таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table t1(
	c1	tinyint,
	c2	int,
	c3	nvarchar( 255 ),
	c4	int,
	c5	tinyint,
	c6	nvarchar( 255 ),
)


Мне нужно в таблицу-переменную сделать выборку с использованием вышеуказанной функции. По смыслу это выглядело бы так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
declare @t2 table(
	r1	int,
	r2	nvarchar( 255 ),
	r3	int
)

insert into @t2
select dbo.f1(c1, c3, c6) from t1


Естественно, так сделать не получается, "Insert Error: Column name or number of supplied values does not match table definition".

Если написать

Код: plaintext
1.
2.
insert into @t2 (r1, r2, r3)
select dbo.f1(c1, c3, c6) from t1


Ошибка будет такой: "The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns"

А как сделать по-человечески? Как объяснить, что у меня функция возвращает выборку из трех колонок, которую надо запихнуть в таблицу из трех же колонок?!
...
Рейтинг: 0 / 0
04.07.2002, 11:33:29
    #32035106
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Что-то не пойму - раз функция возвращает набор разве можно ее использовать так

select dbo.f1(c1, c3, c6) from t1 ?

IMHO только так

select * from dbo.f1(....)
...
Рейтинг: 0 / 0
04.07.2002, 11:33:48
    #32035108
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
В BOL-же всё написано...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create function f1(
  @p1 tinyint,
  @p2 nvarchar( 255 ),
  @p3 nvarchar( 255 )
)
returns @res table(
    r1  int,
    r2  nvarchar( 255 ),
    r3  int
  )
as
begin
 -- some code
 
end
go

insert into @t2 (r1, r2, r3)
select f.r1, f.r2, f.r3 
from dbo.f1( 1 , 'a', 'dddd') as f

...
Рейтинг: 0 / 0
04.07.2002, 11:52:31
    #32035113
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
2 Glory:
Вот именно, что нельзя для table-valued функций :-(( Это нерабочий пример, написанный только для того, чтобы объяснить, что мне нужно.

2 alexeyvg:
Да ежу понятно. Вопрос в том, что мне не константы нужны в качестве параметров функции, а значения полей в таблице. Фиг их укажешь после from. В этом-то и проблема.
...
Рейтинг: 0 / 0
04.07.2002, 12:04:07
    #32035115
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Если задача ставится сгенерировать для каждой записи таблицы дополнительный набор записей то IMHO кроме как через курсор такую проблему не решить
...
Рейтинг: 0 / 0
04.07.2002, 12:08:54
    #32035117
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Я жутко извиняюсь (ой), так тоже не работает:
insert into @t2 (r1, r2, r3)
select top 1 * from
(select dbo.f1(c1, c3, c6) from t1) as ququ ???
...
Рейтинг: 0 / 0
04.07.2002, 12:28:27
    #32035122
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Да, задача стоит именно так: для каждой записи в таблице провести некоторую обработку и результаты сложить в другую таблицу (или вывести во view, не суть важно). Пытаюсь избежать курсора, но пока безуспешно :-(

select top 1 * from
(select dbo.f1(c1, c3, c6) from t1) as ququ

тоже не работает: "No column was specified for column 1 of 'ququ'"
...
Рейтинг: 0 / 0
04.07.2002, 12:51:43
    #32035128
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Уважаемые, а перед тем, как инсерты делать вы просто голые селекты проверяли? На ошибки смотрели?
...
Рейтинг: 0 / 0
04.07.2002, 12:53:17
    #32035130
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Жутко извиняюсь ещё раз , так тоже плохо?
insert into @t2
select * from
(select top 1 dbo.f1(c1, c3, c6) from t1) as ququ ???

ВАПРОС - ПАЧАМУ ???
...
Рейтинг: 0 / 0
04.07.2002, 13:00:16
    #32035134
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Кстати, если ты и избежишь курсора, то не факт, что будет работать быстрее.

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

IMHO курсор+SP будет исполняться по крайней мере не медленнее.
...
Рейтинг: 0 / 0
04.07.2002, 13:00:28
    #32035135
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
атвет: патамучта вот такая хрень

select * from (select 123) as ququ

хоть с top, хоть без него, не работает. Нельзя сделать напрямую select из select'а.
...
Рейтинг: 0 / 0
04.07.2002, 13:03:20
    #32035136
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
select ququ.a from (select 123 as a) as ququ

если на то пошло :)
...
Рейтинг: 0 / 0
04.07.2002, 13:06:18
    #32035137
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
2 VVG_: Да, возможно и так. Но у меня стоит вопрос не столько скорости, сколько удобства использования. Впрочем, не исключено, что я и приду к SP+cursor.
...
Рейтинг: 0 / 0
04.07.2002, 13:09:39
    #32035139
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Что касается оптимизации:

Я бы попытался выделить однотипные операции и на каждую из групп написал бы обработку "в один запрос".

Не может же быть, что каждую запись нужно обрабатывать сваим уникальным образом.
...
Рейтинг: 0 / 0
04.07.2002, 13:21:44
    #32035145
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Уломали :-)) Такая вещь работает:
select ququ.a from (select 123 as a) as ququ

Но с функцией все равно не проходит, потому что в разделе select_list могут быть указаны только scalar-valued функции, насколько я понимаю. Table-valued используются во from разделе.

Поправьте меня, если я ошибаюсь.
...
Рейтинг: 0 / 0
04.07.2002, 13:35:27
    #32035149
Miha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
а может сделать 3 scalar-valued функции?
...
Рейтинг: 0 / 0
04.07.2002, 13:38:02
    #32035152
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Ну это возможно только если table-valued всегда возвращает ровно одну запись. :)
...
Рейтинг: 0 / 0
04.07.2002, 13:57:18
    #32035158
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
В принципе, у меня функция действительно возвращает ровно 1 строку, так что теоретически можно. Но! Вот тогда уж точно дико упадет производительность или разбухнет код. Или и то и то ;-)

Ладно, видимо, через функцию нормально сделать не получается при моей постановке задачи. Всем большое спасибо!
...
Рейтинг: 0 / 0
04.07.2002, 14:59:22
    #32035172
Miha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
ха! раз одну запись, тогда:

insert into @t2
select
(select r1 from dbo.f1(c1, c3, c6)) as r1,
(select r2 from dbo.f1(c1, c3, c6)) as r2,
(select r3 from dbo.f1(c1, c3, c6)) as r3
from t1
...
Рейтинг: 0 / 0
04.07.2002, 15:03:12
    #32035175
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Ну и нафига мне выполнение функции 3 раза вместо одного?!
...
Рейтинг: 0 / 0
04.07.2002, 15:09:49
    #32035179
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Граждане, развейте мои сомнения

У вас что работает данный код ?

select t1.*, (select top 1 r1 from dbo.f1(t1.c1, t1.c3, t1.c6)) AS xx from t1
...
Рейтинг: 0 / 0
04.07.2002, 15:28:40
    #32035190
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Нет, такое работать не будет, ибо функция должна выполниться один раз и ДО join'a, а не во время его.
...
Рейтинг: 0 / 0
04.07.2002, 15:46:05
    #32035192
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Причем здесь JOIN ?
Я пытаюсь использовать выборку из Table-valued функции в качестве вычисляемого столбца
...
Рейтинг: 0 / 0
04.07.2002, 15:47:29
    #32035194
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Ведь такой запрос работает
Код: plaintext
1.
2.
3.
use pubs
go
select a.au_id, (select top  1  pub_id from pub_info) as xx from authors a
...
Рейтинг: 0 / 0
04.07.2002, 16:04:15
    #32035200
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка результата функции (table-valued) в таблицу
Извини, я просто то же самое с join'ами пытался, вот и ответил впопыхах. :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вставка результата функции (table-valued) в таблицу / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]