T-SQL: for each record ...
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Gadi
- Графоман
- Сообщения: 18502
- Зарегистрирован: 18 апр 2007, 11:33
T-SQL: for each record ...
Можно ли (в T-SQL) обойтись без курсора если нужно , например выполнить stored procedure для каждой записи из определенной таблицы?
-
- Пользователь
- Сообщения: 107
- Зарегистрирован: 02 авг 2004, 22:00
Re: T-SQL: for each record ...
Gadi, шалом
Нет ,неполучится, хотя если Вы испльзуете SQL Server 2008 то стоит взглянуть на
create table myTable (col1 int, col2 datetime, col3 varchar(max))
go
create type myTableType as table (col1 int, col2 datetime, col3 varchar(max))
go
create procedure up_myTable_insertFromTable
@myTableData myTableType readonly
as
insert into myTable (col1, col2, col3 )
select col1, col2, col3
from @myTableData
go
declare @myTable myTableType
insert into @myTable values(1, getdate(), 'Table Valued Parameters are great')
exec up_myTable_insertFromTable @myTable
Нет ,неполучится, хотя если Вы испльзуете SQL Server 2008 то стоит взглянуть на
create table myTable (col1 int, col2 datetime, col3 varchar(max))
go
create type myTableType as table (col1 int, col2 datetime, col3 varchar(max))
go
create procedure up_myTable_insertFromTable
@myTableData myTableType readonly
as
insert into myTable (col1, col2, col3 )
select col1, col2, col3
from @myTableData
go
declare @myTable myTableType
insert into @myTable values(1, getdate(), 'Table Valued Parameters are great')
exec up_myTable_insertFromTable @myTable
- pastor
- Завсегдатай
- Сообщения: 418
- Зарегистрирован: 21 июн 2006, 01:09
- Откуда: UA (2:4623) > Vancouver
Re: T-SQL: for each record ...
Имхо эти две строчки противоречат друг другу.Gadi писал(а):...обойтись без курсора...
...выполнить stored procedure для каждой записи из определенной таблицы...
Хотя, можно по идее извратиться, используя User Defined Function. Все зависит от того, что ваша процедура делает. В принципе, курсоры -- это зло, но иногда без них никак.
- Gadi
- Графоман
- Сообщения: 18502
- Зарегистрирован: 18 апр 2007, 11:33
Re: T-SQL: for each record ...
А в чем противоречие? Да, сп выполняет действия в совершенно другой таблице; не вижу как природа этих действий влияет на ответ на заданный вопросpastor писал(а):Имхо эти две строчки противоречат друг другу.Gadi писал(а):...обойтись без курсора...
...выполнить stored procedure для каждой записи из определенной таблицы...
Хотя, можно по идее извратиться, используя User Defined Function. Все зависит от того, что ваша процедура делает. В принципе, курсоры -- это зло, но иногда без них никак.

- Gadi
- Графоман
- Сообщения: 18502
- Зарегистрирован: 18 апр 2007, 11:33
Re: T-SQL: for each record ...
Неа, базы живые и ... старыеYuri Dimant писал(а):
Нет ,неполучится, хотя если Вы испльзуете SQL Server 2008 ...

В принципе для каждой записи из таблицы надо посоздавать несколько записей в другой таблице, используя значения двух полей
С курсором все работает, думал может можно "поэлегантней"

- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
Re: T-SQL: for each record ...
в тскл без курсора ты для каждой записи сп не вызовешь... даже если бы такая возможность была, то это было бы чтото не так с дизайном.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
Re: T-SQL: for each record ...
код пришли (можно в лс).... кажется мне что есть шанс это сделать просто одним инсертом буз всяких СПшек....Gadi писал(а):Неа, базы живые и ... старыеYuri Dimant писал(а):
Нет ,неполучится, хотя если Вы испльзуете SQL Server 2008 ..., управляются SQL Server 2005
В принципе для каждой записи из таблицы надо посоздавать несколько записей в другой таблице, используя значения двух полей
С курсором все работает, думал может можно "поэлегантней"
- pastor
- Завсегдатай
- Сообщения: 418
- Зарегистрирован: 21 июн 2006, 01:09
- Откуда: UA (2:4623) > Vancouver
Re: T-SQL: for each record ...
Обойтись без курсора И выполнить stored proc для каждой записи. Без перебора записей это ИМХО невозможно (по крайней мере в версиях до 2005 включительно).Gadi писал(а):А в чем противоречие?
Откуда я знаю, может вы просто значения вычисляете в своей хранимой процедуре? Поэтому нужно знать в общем что делает процедура (в данном случае информации о том, что она выполняет действия в сторонней таблице вполне достаточно), чтобы ответить на ваш вопрос, разве не так?Gadi писал(а):Да, сп выполняет действия в совершенно другой таблице; не вижу как природа этих действий влияет на ответ на заданный вопрос

Взгляните на вот это решение. По-моему, ничем не лучше курсора. Я бы копАл в сторону UDF или оставил как есть (с курсором).
-
- Пользователь
- Сообщения: 72
- Зарегистрирован: 27 май 2006, 13:47
- Откуда: Мурманск - Ванкувер
Re: T-SQL: for each record ...
В M$SQL 2005 можно на дотНет код писать, так что можно вполне и без курсора. Только будет ли это эффективней - это вопрос...Gadi писал(а): управляются SQL Server 2005
- Leo Gan
- Маньяк
- Сообщения: 1764
- Зарегистрирован: 29 апр 2005, 16:55
- Откуда: где-то рядом с жёлтым карликом
- Контактная информация:
Re: T-SQL: for each record ...
В SQL все зло, кроме Select, Insert, Delete, Update, Commit, Rollback.pastor писал(а):Имхо эти две строчки противоречат друг другу.Gadi писал(а):...обойтись без курсора...
...выполнить stored procedure для каждой записи из определенной таблицы...
Хотя, можно по идее извратиться, используя User Defined Function. Все зависит от того, что ваша процедура делает. В принципе, курсоры -- это зло, но иногда без них никак.
Все остальное из эпохи динозавров

-
- Пользователь
- Сообщения: 72
- Зарегистрирован: 27 май 2006, 13:47
- Откуда: Мурманск - Ванкувер
Re: T-SQL: for each record ...
SQL сам по себе злоLeo Gan писал(а): В SQL все зло, кроме Select, Insert, Delete, Update, Commit, Rollback.
Все остальное из эпохи динозавров
