T-SQL: for each record ...

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Gadi
Графоман
Сообщения: 18502
Зарегистрирован: 18 апр 2007, 11:33

T-SQL: for each record ...

Сообщение Gadi »

Можно ли (в T-SQL) обойтись без курсора если нужно , например выполнить stored procedure для каждой записи из определенной таблицы?
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

Re: T-SQL: for each record ...

Сообщение Yuri Dimant »

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
Аватара пользователя
pastor
Завсегдатай
Сообщения: 418
Зарегистрирован: 21 июн 2006, 01:09
Откуда: UA (2:4623) > Vancouver

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 ...

Сообщение Gadi »

pastor писал(а):
Gadi писал(а):...обойтись без курсора...
...выполнить stored procedure для каждой записи из определенной таблицы...
Имхо эти две строчки противоречат друг другу.
Хотя, можно по идее извратиться, используя User Defined Function. Все зависит от того, что ваша процедура делает. В принципе, курсоры -- это зло, но иногда без них никак.
А в чем противоречие? Да, сп выполняет действия в совершенно другой таблице; не вижу как природа этих действий влияет на ответ на заданный вопрос :roll:
Аватара пользователя
Gadi
Графоман
Сообщения: 18502
Зарегистрирован: 18 апр 2007, 11:33

Re: T-SQL: for each record ...

Сообщение Gadi »

Yuri Dimant писал(а):
Нет ,неполучится, хотя если Вы испльзуете SQL Server 2008 ...
Неа, базы живые и ... старые :) , управляются SQL Server 2005

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

С курсором все работает, думал может можно "поэлегантней" :)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 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 ...

Сообщение pastor »

Gadi писал(а):А в чем противоречие?
Обойтись без курсора И выполнить stored proc для каждой записи. Без перебора записей это ИМХО невозможно (по крайней мере в версиях до 2005 включительно).
Gadi писал(а):Да, сп выполняет действия в совершенно другой таблице; не вижу как природа этих действий влияет на ответ на заданный вопрос :roll:
Откуда я знаю, может вы просто значения вычисляете в своей хранимой процедуре? Поэтому нужно знать в общем что делает процедура (в данном случае информации о том, что она выполняет действия в сторонней таблице вполне достаточно), чтобы ответить на ваш вопрос, разве не так? :roll: Тем более это вытекает из контекста предложения попробовать обернуть логику процедуры в UDF.

Взгляните на вот это решение. По-моему, ничем не лучше курсора. Я бы копАл в сторону UDF или оставил как есть (с курсором).
SlavaM
Пользователь
Сообщения: 72
Зарегистрирован: 27 май 2006, 13:47
Откуда: Мурманск - Ванкувер

Re: T-SQL: for each record ...

Сообщение SlavaM »

Gadi писал(а): управляются SQL Server 2005
В M$SQL 2005 можно на дотНет код писать, так что можно вполне и без курсора. Только будет ли это эффективней - это вопрос...
Аватара пользователя
Leo Gan
Маньяк
Сообщения: 1764
Зарегистрирован: 29 апр 2005, 16:55
Откуда: где-то рядом с жёлтым карликом
Контактная информация:

Re: T-SQL: for each record ...

Сообщение Leo Gan »

pastor писал(а):
Gadi писал(а):...обойтись без курсора...
...выполнить stored procedure для каждой записи из определенной таблицы...
Имхо эти две строчки противоречат друг другу.
Хотя, можно по идее извратиться, используя User Defined Function. Все зависит от того, что ваша процедура делает. В принципе, курсоры -- это зло, но иногда без них никак.
В SQL все зло, кроме Select, Insert, Delete, Update, Commit, Rollback.
Все остальное из эпохи динозавров :s2:
SlavaM
Пользователь
Сообщения: 72
Зарегистрирован: 27 май 2006, 13:47
Откуда: Мурманск - Ванкувер

Re: T-SQL: for each record ...

Сообщение SlavaM »

Leo Gan писал(а): В SQL все зло, кроме Select, Insert, Delete, Update, Commit, Rollback.
Все остальное из эпохи динозавров :s2:
SQL сам по себе зло :wink:. Прямые интерфейсы куда как лучше!
Ответить