2015-11-19 2 views
1

У меня вопрос относительно курсора в t-sql. Когда я сделаю такой курсор, он окажется в бесконечном цикле.Cursor - Объявить выбор-заявление, выполненное несколько раз?

drop table [dbo].[cursorcheck] 
GO 

CREATE TABLE [dbo].[cursorcheck](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Wert] [varchar](10) NOT NULL 
) ON [PRIMARY] 
GO 


delete dbo.cursorcheck 
GO 

insert into dbo.cursorcheck 
select 'Insert' 
GO 


DECLARE @vendor_id int, @vendor_name nvarchar(50); 

DECLARE vendor_cursor CURSOR FOR 

SELECT ID, wert 
FROM dbo.cursorcheck 
WHERE wert = 'insert'; 

OPEN vendor_cursor 

FETCH NEXT FROM vendor_cursor 
INTO @vendor_id, @vendor_name 

WHILE @@FETCH_STATUS = 0 
BEGIN 



     insert into dbo.cursorcheck 
     select 'Insert' 


    FETCH NEXT FROM vendor_cursor 
    INTO @vendor_id, @vendor_name 
END 
CLOSE vendor_cursor; 
DEALLOCATE vendor_cursor; 

Я немного смущен этим поведением. Означает ли это, что скрипт select, указатель которого был объявлен, выполняется несколько раз? я получил тот же эффект, когда я вставляю в эту таблицу из другой транзакции при отладке курсора. проблема решена, когда я использую «статическое» ключевое слово для объявления курсора. но я запутался в поведении курсора, когда я не использую ключевое слово static.

любое объяснение?

С уважением, Рето

ответ

0

Ключ вы пытаетесь прочитать и вставить ту же таблицу в цикле (так как «змея ест свой хвост»):

Курсор:

DECLARE vendor_cursor CURSOR FOR 
    SELECT ID, wert 
    FROM dbo.cursorcheck 
    WHERE wert = 'insert'; 

И петля:

WHILE @@FETCH_STATUS = 0 
BEGIN 
    insert into dbo.cursorcheck 
    select 'Insert' 

    FETCH NEXT FROM vendor_cursor 
    INTO @vendor_id, @vendor_name 
END 

Для второго вопроса: Проблема решена, когда я использую «статические»:

STATIC CURSOR

Полный набор результатов статического курсора построен в базе данных TempDb, когда курсор открыт. Статический курсор всегда отображает результирующий набор, так как он был , когда курсор был открыт.

и:

Курсор не отражает каких-либо изменений, внесенных в базу данных, которые влияют либо членство в наборе результатов или изменения в значений в столбцах строки, которые делают вверх по набору результатов. статический курсор не отображается новые строк, вставленных в базе данных после был открыт курсор, даже если они соответствуют условиям поиска на курсора ЗЕЬЕСТА

+0

спасибо. Да. это правда. но это означает, что оператор «select» снова запускается против базы данных, а не только в начале, правильно? – csarwi

+0

@RetoWietlisbach Без 'STATIC' он работает с реальными данными (например, отложенным исполнением), STATIC сначала считывается один раз и хранится в tempdb – lad2025

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