2013-11-25 3 views
0

Я пытаюсь запустить хранимую процедуру для таблицы, а не одну строку. Я выбираю хранимую процедуру, поскольку мне нужно вставлять записи в таблицу и делать некоторые обновления. Этот метод, кажется, висит. Я рассмотрел план объяснения, но я думаю, что что-то не так с моей логикой, и оно обрабатывает одну запись и останавливается.Запуск хранимой процедуры для таблицы

Это код, который у меня есть до сих пор. Моя хранимая процедура работает как зверь, и я не думаю, что это проблема.

---- Create a driver table for the stored procedure to run off . 
drop table #Driver_Table 

select col1, col2 
IDENTITY(int) AS idcol 
INTO #Driver_Table 
FROM CUSTOMER 
--- Contains about 37 k records 

--- Index added for performance 
CREATE CLUSTERED INDEX IDX_C_Driver_Table_UserID ON #Driver_Table(idcol) 

-- Define the last customer ID to be handled 
DECLARE @LastCustomerID INT 
SET @LastCustomerID = 0 

--- Other parameter the queries will use 
DECLARE @idcol INT 
DECLARE @col1 datetime 
DECLARE @col2 varchar(200) 

SET @idcol= 0 

-- Iterate over all customers 
BEGIN 

-- Get next customerId 
SELECT TOP 1 @idcol = idcol FROM #Driver_Table 
WHERE idcol > @LastCustomerID 

select TOP 1 @col1=col1 
FROM #Driver_Table 
WHERE idcol > @LastCustomerID 

select TOP 1 @col2=col2 
FROM #Driver_Table 
WHERE idcol > @LastCustomerID 

---- To get the process to end when last customer is processed. 
WHILE @col2 NOT NULL 

-- call your sproc 
EXEC SP @col1,@Col2 

-- set the last customer handled to the one we just handled 
SET @LastCustomerID = @idcol 
SET @col2 = NULL 

-- select the next customer to handle 
SELECT TOP 1 @col2 = col2 
FROM #Driver_Table 
WHERE idcol > @LastCustomerID 

END 

SQL SERVER 2005

GO

+0

Вы не можете «запустить хранимую процедуру для таблицы» - но вы можете изменить хранимую процедуру (или добавить новую), которая будет обрабатывать набор, а не все эта рабочая таблица temp/курсор занята. Если вы покажете определение SP, то кто-то может помочь вам в этом. –

ответ

1

С предоставленной информацией я могу видеть, что есть ваш Хотя синтаксис Loop не так ... первый у вас нету закрытые операции в цикле в то время как в НАЧАТЬ END блока, 2nd У вас бесконечный цикл while, который будет продолжать выполняться, поскольку вы не уменьшаете количество записей в вашей временной таблице каждый раз, когда выполняется цикл while. попробуйте что-то вроде этого ...

WHILE (EXISTS (SELECT * FROM #Driver_Table)) 

BEGIN 

    SELECT TOP 1 @idcol = idcol, @col1=col1, @col2=col2 
    FROM #Driver_Table 


    EXEC SP @col1,@Col2 

    DELETE FROM #Driver_Table 
    WHERE idcol = @idcol; 


END 
+0

Это работает, хотя моя хранимая процедура показывает немного проблемы с производительностью. Я могу задать отдельный вопрос. Спасибо. –

+0

рад, что это помогло. Я не знаю, что такое EXEC SP и что он делает, но код может быть упрощен. Всегда есть лучший способ делать то, что они говорят :) –

Смежные вопросы