2013-08-28 2 views
0

Я следующий сценарий для создания данных временныхSQL Looping временной таблицы и чтение данных

DECLARE @Name NVARCHAR(100), @Marks INT 
DECLARE @MYTABLE TABLE 
(
    [Name][nvarchar](100) NULL, 
    [Marks][INT] NULL 
) 

INSERT INTO @MYTABLE ([Name],[Marks]) VALUES ('Mark',50); 
INSERT INTO @MYTABLE ([Name],[Marks]) VALUES ('Steve',50); 
INSERT INTO @MYTABLE ([Name],[Marks]) VALUES ('Don',50); 

Теперь я хочу цикл его, как показано ниже сценарий

SELECT @MaxPK = MAX(PK) from @MYTABLE 
WHILE @PK <= @MaxPK 
BEGIN 
SET @Name = SELECT Name from @MYTABLE 
SET @Marks = SELECT Marks from @MYTABLE 
print @Name 
print @Marks 
SET @PK = @PK + 1 
END 

Но я получаю сообщение об ошибке рядом ЗЕЬЕСТА ,

«Неверный синтаксис рядом с ключевым словом SELECT»!

+0

Возможно, это потому, что этот оператор select возвращает несколько строк, а не одно значение, и вы не можете установить несколько строк в свою переменную @Name –

+0

Помимо чего-либо еще 'PK' не существует в' @ MYTABLE'. И почему вам все равно нужно перебирать строки по очереди? И если у вас действительно есть такая потребность, почему бы не использовать курсор для ввода в '@ Name, @ Marks, @ PK' вместо имитации одного с циклом while? –

+0

Привет, Dark, я добавлю условие WHERE, чтобы он всегда возвращал одну строку. –

ответ

1

Две строки, в которых вы устанавливаете переменные, могут быть собраны вместе. Таким образом, вы будете только сканировать таблицу один раз.

SELECT @Name = Name, @Marks = Marks FROM @MYTABLE 

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

+0

Да, его работа. Благодаря... –

1

Пожалуйста, попробуйте ниже в то время как петля:

WHILE @PK <= @MaxPK 
BEGIN 
SELECT @Name = Name, @Marks = Marks from @MYTABLE 
print @Name 
print @Marks 
END 

Примечание: Я думаю, а, где условие необходимо в операторе отбора, чтобы распечатать все данные.