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

Откуда:
Сообщений: 545
Есть хранимая процедура. Как ее вызвать для каждой строки таблицы?
9 авг 11, 12:41    [11090630]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
прочитать каждую запись и вызвать
9 авг 11, 12:43    [11090643]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
Glory
прочитать каждую запись и вызвать

Я не силен SQL. Я предполагаю что это надо сделать в цикле. Но не знаю ни синтаксиса циклов ни как задать условие "делать пока не конец таблицы". Черкните пару строк кода, если не сложно.
9 авг 11, 12:46    [11090679]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
a.ivanov
Member

Откуда: Москва
Сообщений: 112
2king2,

Кури курсоры.
9 авг 11, 12:55    [11090785]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
А как передать значения в хранимую процедуру?
9 авг 11, 13:51    [11091282]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
2king2,
может табличная функция и CROSS APPLY
9 авг 11, 14:00    [11091363]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
a.ivanov
Member

Откуда: Москва
Сообщений: 112
2king2,

А откуда вообще желание такое, вызывать ХП для каждой строки?
9 авг 11, 14:02    [11091381]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
a.ivanov
2king2,

А откуда вообще желание такое, вызывать ХП для каждой строки?


Каждая строка должна быть направлена хп, откуда данные должны попасть в одну или другую таблицу
9 авг 11, 14:14    [11091470]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
2king2
Каждая строка должна быть направлена хп, откуда данные должны попасть в одну или другую таблицу
А написать два запроса, которые без всяких процедур вставят все нужные записи в нужные таблицы не судьба?

Сообщение было отредактировано: 9 авг 11, 14:17
9 авг 11, 14:17    [11091486]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
2king2
А как передать значения в хранимую процедуру?

Через параметры этой процедуры
9 авг 11, 14:19    [11091505]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
Гавриленко Сергей Алексеевич
2king2
Каждая строка должна быть направлена хп, откуда данные должны попасть в одну или другую таблицу
А написать два запроса, которые без всяких процедур вставят все нужные записи в нужные таблицы не судьба?


Есть готовый механизм который заложен в хранимку. Черкните пару строк как из передать данные в хранимку, а дальше я сам попробую. Заранее благодарен.
9 авг 11, 14:20    [11091509]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Гавриленко Сергей Алексеевич
2king2
Каждая строка должна быть направлена хп, откуда данные должны попасть в одну или другую таблицу
А написать два запроса, которые без всяких процедур вставят все нужные записи в нужные таблицы не судьба?


2king2
Я не силен SQL.
9 авг 11, 14:20    [11091514]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
2king2
Есть хранимая процедура. Как ее вызвать для каждой строки таблицы?
Где она?
Скрипт напишите.
9 авг 11, 14:21    [11091517]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
iap
2king2
Есть хранимая процедура. Как ее вызвать для каждой строки таблицы?
Где она?
Скрипт напишите.


+ ХП

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--DROP PROCEDURE dbo.InsertPosition
ALTER PROCEDURE [dbo].[InsertPosition]
(
    @unitId int,
    @receivedOn datetime,
    @sentOn datetime,
    @latitude real,
    @longitude real,
    @altitude real,
    @speed real,
    @course real,
    @satellitesVisible int,
    @gsmSignal int,
	@power real,
	@battery real,
    @ignition bit,
    @openDoor bit,
    @openHood bit,
    @panic bit,
    @fuelLeft real,
    @rpm int,
    @temperature int,
	@milage real,
    @inputs nvarchar(max),
    @can nvarchar(max),
    @special nvarchar(max)
)
--RETURNS int
AS
BEGIN
	DECLARE @id int

	BEGIN TRANSACTION
		SET @id = isnull((select max (id) from [dbo].[Position]), 0) + 1;

		INSERT INTO [dbo].[Position]
		(
			--[id],
			[unitId],
			[receivedOn],
			[sentOn],
			[latitude],
			[longitude],
			[altitude],
			[speed],
			[course],
			[satellitesVisible],
			[gsmSignal],
			[power],
			[battery],
			[ignition],
			[openDoor],
			[openHood],
			[panic],
			[fuelLeft],
			[rpm],
			[temperature],
			[inputs],
			[milage],
			[can],
			[special]
		)
			 VALUES
		(
			--@id,
			@unitId,
			@receivedOn,
			@sentOn,
			@latitude,
			@longitude,
			@altitude,
			@speed,
			@course,
			@satellitesVisible,
			@gsmSignal,
			@power,
			@battery,
			@ignition,
			@openDoor,
			@openHood,
			@panic,
			@fuelLeft,
			@rpm,
			@temperature,
			@inputs,
			@milage,
			@can,
			@special
		)

		IF (EXISTS (SELECT * FROM [dbo].[LastPosition] WHERE [unitId] = @unitId))
		BEGIN
			UPDATE [dbo].[LastPosition]
			  SET
				[receivedOn] = @receivedOn,
				[sentOn] = @sentOn,
				[latitude] = @latitude,
				[longitude] = @longitude,
				[altitude] = @altitude,
				[speed] = @speed,
				[course] = @course,
				[satellitesVisible] = @satellitesVisible,
				[gsmSignal] = @gsmSignal,
				[power] = @power,
				[battery] = @battery,
				[ignition] = @ignition,
				[openDoor] = @openDoor,
				[openHood] = @openHood,
				[panic] = @panic,
				[fuelLeft] = @fuelLeft,
				[rpm] = @rpm,
				[temperature] = @temperature,
				[inputs] = @inputs,
				[milage] = @milage,
				[can] = @can,
				[special] = @special
			  WHERE
				[unitId] = @unitId
		END
		ELSE
		BEGIN
			INSERT INTO [dbo].[LastPosition]
			(
				--[id],
				[unitId],
				[receivedOn],
				[sentOn],
				[latitude],
				[longitude],
				[altitude],
				[speed],
				[course],
				[satellitesVisible],
				[gsmSignal],
				[power],
				[battery],
				[ignition],
				[openDoor],
				[openHood],
				[panic],
				[fuelLeft],
				[rpm],
				[temperature],
				[inputs],
				[milage],
				[can],
				[special]
			)
				 VALUES
			(
				--@id,
				@unitId,
				@receivedOn,
				@sentOn,
				@latitude,
				@longitude,
				@altitude,
				@speed,
				@course,
				@satellitesVisible,
				@gsmSignal,
				@power,
				@battery,
				@ignition,
				@openDoor,
				@openHood,
				@panic,
				@fuelLeft,
				@rpm,
				@temperature,
				@inputs,
				@milage,
				@can,
				@special
			)
		END

	COMMIT TRANSACTION

	RETURN @id
END

9 авг 11, 14:29    [11091587]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
2king2,

а где обработка ошибок?
9 авг 11, 14:34    [11091624]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
tpg
2king2,

а где обработка ошибок?


Я не шарю. Пришел начальник и сказал надо предать данные хранимки. Так требуют кто то там. А я не разу не програмисn sql.
9 авг 11, 14:37    [11091655]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
2king2
tpg
2king2,

а где обработка ошибок?


Я не шарю. Пришел начальник и сказал надо предать данные хранимки. Так требуют кто то там. А я не разу не програмисn sql.
Хорошо хоть пол не попросил помыть.
9 авг 11, 14:38    [11091663]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
2king2
iap
пропущено...
Где она?
Скрипт напишите.


+
+ ХП

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--DROP PROCEDURE dbo.InsertPosition
ALTER PROCEDURE [dbo].[InsertPosition]
(
    @unitId int,
    @receivedOn datetime,
    @sentOn datetime,
    @latitude real,
    @longitude real,
    @altitude real,
    @speed real,
    @course real,
    @satellitesVisible int,
    @gsmSignal int,
	@power real,
	@battery real,
    @ignition bit,
    @openDoor bit,
    @openHood bit,
    @panic bit,
    @fuelLeft real,
    @rpm int,
    @temperature int,
	@milage real,
    @inputs nvarchar(max),
    @can nvarchar(max),
    @special nvarchar(max)
)
--RETURNS int
AS
BEGIN
	DECLARE @id int

	BEGIN TRANSACTION
		SET @id = isnull((select max (id) from [dbo].[Position]), 0) + 1;

		INSERT INTO [dbo].[Position]
		(
			--[id],
			[unitId],
			[receivedOn],
			[sentOn],
			[latitude],
			[longitude],
			[altitude],
			[speed],
			[course],
			[satellitesVisible],
			[gsmSignal],
			[power],
			[battery],
			[ignition],
			[openDoor],
			[openHood],
			[panic],
			[fuelLeft],
			[rpm],
			[temperature],
			[inputs],
			[milage],
			[can],
			[special]
		)
			 VALUES
		(
			--@id,
			@unitId,
			@receivedOn,
			@sentOn,
			@latitude,
			@longitude,
			@altitude,
			@speed,
			@course,
			@satellitesVisible,
			@gsmSignal,
			@power,
			@battery,
			@ignition,
			@openDoor,
			@openHood,
			@panic,
			@fuelLeft,
			@rpm,
			@temperature,
			@inputs,
			@milage,
			@can,
			@special
		)

		IF (EXISTS (SELECT * FROM [dbo].[LastPosition] WHERE [unitId] = @unitId))
		BEGIN
			UPDATE [dbo].[LastPosition]
			  SET
				[receivedOn] = @receivedOn,
				[sentOn] = @sentOn,
				[latitude] = @latitude,
				[longitude] = @longitude,
				[altitude] = @altitude,
				[speed] = @speed,
				[course] = @course,
				[satellitesVisible] = @satellitesVisible,
				[gsmSignal] = @gsmSignal,
				[power] = @power,
				[battery] = @battery,
				[ignition] = @ignition,
				[openDoor] = @openDoor,
				[openHood] = @openHood,
				[panic] = @panic,
				[fuelLeft] = @fuelLeft,
				[rpm] = @rpm,
				[temperature] = @temperature,
				[inputs] = @inputs,
				[milage] = @milage,
				[can] = @can,
				[special] = @special
			  WHERE
				[unitId] = @unitId
		END
		ELSE
		BEGIN
			INSERT INTO [dbo].[LastPosition]
			(
				--[id],
				[unitId],
				[receivedOn],
				[sentOn],
				[latitude],
				[longitude],
				[altitude],
				[speed],
				[course],
				[satellitesVisible],
				[gsmSignal],
				[power],
				[battery],
				[ignition],
				[openDoor],
				[openHood],
				[panic],
				[fuelLeft],
				[rpm],
				[temperature],
				[inputs],
				[milage],
				[can],
				[special]
			)
				 VALUES
			(
				--@id,
				@unitId,
				@receivedOn,
				@sentOn,
				@latitude,
				@longitude,
				@altitude,
				@speed,
				@course,
				@satellitesVisible,
				@gsmSignal,
				@power,
				@battery,
				@ignition,
				@openDoor,
				@openHood,
				@panic,
				@fuelLeft,
				@rpm,
				@temperature,
				@inputs,
				@milage,
				@can,
				@special
			)
		END

	COMMIT TRANSACTION

	RETURN @id
END

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

А почему нельзя вставить в другую таблицу все записи одним INSERTом?
9 авг 11, 15:00    [11091945]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
iap
А почему нельзя вставить в другую таблицу все записи одним INSERTом?


Одна таблица полный лог, другая только свежие данные
9 авг 11, 15:07    [11092018]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
2king2
tpg
2king2,

а где обработка ошибок?


Я не шарю. Пришел начальник и сказал надо предать данные хранимки. Так требуют кто то там. А я не разу не програмисn sql.


да не переживайте сильно. тот, кто придумал при помощи этой хранимки обрабатывать все строки по одной, тоже не программист sql :)
9 авг 11, 15:07    [11092021]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
Shakill
да не переживайте сильно. тот, кто придумал при помощи этой хранимки обрабатывать все строки по одной, тоже не программист sql :)


Ну пожалуйста по существу пишите. Я не понимаю ваш сарказм.
9 авг 11, 15:22    [11092131]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
2king2
Shakill
да не переживайте сильно. тот, кто придумал при помощи этой хранимки обрабатывать все строки по одной, тоже не программист sql :)


Ну пожалуйста по существу пишите. Я не понимаю ваш сарказм.

выше уже несколько раз намекали, что эффективнее будет не дергать хранимку для каждой строчки, а написать другую, которая выполнит ту же работу при помощи пары запросов сразу для всего набора данных. так будет и проще, и быстрее, как правило
9 авг 11, 15:25    [11092159]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
2king2
Member

Откуда:
Сообщений: 545
Shakill
выше уже несколько раз намекали, что эффективнее будет не дергать хранимку для каждой строчки, а написать другую, которая выполнит ту же работу при помощи пары запросов сразу для всего набора данных. так будет и проще, и быстрее, как правило


Я это понял. Но я пытаюсь сделать как мне говорит начальник (я послушный). Мне както надо передать значения в хранимку. Покажите пример и я успокоюсь.
9 авг 11, 15:35    [11092249]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
2king2
Shakill
выше уже несколько раз намекали, что эффективнее будет не дергать хранимку для каждой строчки, а написать другую, которая выполнит ту же работу при помощи пары запросов сразу для всего набора данных. так будет и проще, и быстрее, как правило


Я это понял. Но я пытаюсь сделать как мне говорит начальник (я послушный). Мне както надо передать значения в хранимку. Покажите пример и я успокоюсь.


в БОЛ есть сразу несколько примеров и по курсорам, и по передаче параметров в хранимки. Статьи DECLARE CURSOR и EXECUTE
9 авг 11, 15:44    [11092320]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимой процедуры для каждой строки таблицы?  [new]
_____aak__
Member

Откуда:
Сообщений: 13
2king2,

2king2,

Ну например

--переменные для вашего т.н цикла

declare 
	@unitId int,
    @receivedOn datetime,
    @sentOn datetime,
    @latitude real,
    @longitude real,
    @altitude real,
    @speed real,
    @course real,
    @satellitesVisible int,
    @gsmSignal int,
	@power real,
	@battery real,
    @ignition bit,
    @openDoor bit,
    @openHood bit,
    @panic bit,
    @fuelLeft real,
    @rpm int,
    @temperature int,
	@milage real,
    @inputs nvarchar(max),
    @can nvarchar(max),
    @special nvarchar(max)
--обьявили курсор для начитывания значений переменных которые буду передаваться в процедуру
DECLARE cur_inserted CURSOR
FOR --pltcm ye
  select	
  	  unitId,
      receivedOn,
      sentOn,
      latitude,
      longitude,
      altitude,
      speed,
      course,
      satellitesVisible,
      gsmSignal,
  	  [power],
  	  battery,
      ignition,
      openDoor,
      openHood,
      panic,
      fuelLeft,
      rpm,
      temperature,
  	  milage,
      inputs,
      can,
      special
  from
  	[ваша таблица]
  where
  	[ваши условия для выбора строк цикла]
	
OPEN cur_inserted
	

FETCH NEXT FROM cur_inserted INTO 
      @unitId,
      @receivedOn,
      @sentOn,
      @latitude,
      @longitude,
      @altitude,
      @speed,
      @course,
      @satellitesVisible,
      @gsmSignal,
  	  @[power],
  	  @battery,
      @ignition,
      @openDoor,
      @openHood,
      @panic,
      @fuelLeft,
      @rpm,
      @temperature,
  	  @milage,
      @inputs,
      @can,
      @special
      
if(@@FETCH_STATUS=-1)
begin
	CLOSE cur_inserted 
	DEALLOCATE cur_inserted
	return
end	
WHILE @@FETCH_STATUS = 0
BEGIN

  --вызов вашей процедуры с передачей ей параметров
  exec InsertPosition @unitId,@receivedOn,...,@special

  FETCH NEXT FROM cur_inserted INTO 
        @unitId,
        @receivedOn,
        @sentOn,
        @latitude,
        @longitude,
        @altitude,
        @speed,
        @course,
        @satellitesVisible,
        @gsmSignal,
    	  @[power],
    	  @battery,
        @ignition,
        @openDoor,
        @openHood,
        @panic,
        @fuelLeft,
        @rpm,
        @temperature,
    	  @milage,
        @inputs,
        @can,
        @special
END

CLOSE cur_inserted 
DEALLOCATE cur_inserted
..как то так
но лучше объяснить начальнику,что так не делают ..вариантов для появления проблем при таком способе масса, товарищи в ответах выше абсолютно правильно говорили про другие подходы к решению Вашей проблемы
9 авг 11, 17:28    [11093295]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить