Страница 1 из 1

T-SQL: for each record ...

Добавлено: 10 авг 2009, 14:43
Gadi
Можно ли (в T-SQL) обойтись без курсора если нужно , например выполнить stored procedure для каждой записи из определенной таблицы?

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

Добавлено: 10 авг 2009, 21:04
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

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

Добавлено: 10 авг 2009, 21:12
pastor
Gadi писал(а):...обойтись без курсора...
...выполнить stored procedure для каждой записи из определенной таблицы...
Имхо эти две строчки противоречат друг другу.
Хотя, можно по идее извратиться, используя User Defined Function. Все зависит от того, что ваша процедура делает. В принципе, курсоры -- это зло, но иногда без них никак.

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

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

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

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

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

С курсором все работает, думал может можно "поэлегантней" :)

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

Добавлено: 11 авг 2009, 09:27
папа Карло
в тскл без курсора ты для каждой записи сп не вызовешь... даже если бы такая возможность была, то это было бы чтото не так с дизайном.

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

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

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

С курсором все работает, думал может можно "поэлегантней" :)
код пришли (можно в лс).... кажется мне что есть шанс это сделать просто одним инсертом буз всяких СПшек....

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

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

Взгляните на вот это решение. По-моему, ничем не лучше курсора. Я бы копАл в сторону UDF или оставил как есть (с курсором).

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

Добавлено: 12 авг 2009, 00:31
SlavaM
Gadi писал(а): управляются SQL Server 2005
В M$SQL 2005 можно на дотНет код писать, так что можно вполне и без курсора. Только будет ли это эффективней - это вопрос...

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

Добавлено: 27 авг 2009, 10:50
Leo Gan
pastor писал(а):
Gadi писал(а):...обойтись без курсора...
...выполнить stored procedure для каждой записи из определенной таблицы...
Имхо эти две строчки противоречат друг другу.
Хотя, можно по идее извратиться, используя User Defined Function. Все зависит от того, что ваша процедура делает. В принципе, курсоры -- это зло, но иногда без них никак.
В SQL все зло, кроме Select, Insert, Delete, Update, Commit, Rollback.
Все остальное из эпохи динозавров :s2:

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

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