Как я могу вернуть выбор SQL в переменную SQL - PullRequest
0 голосов
/ 03 мая 2010

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

DECLARE @i int

@Result = (SELECT * FROM UserImport)

SET @i = 0
WHILE @i < (SELECT Count(@Result) As Count)
BEGIN
   /* Do Stuff */
END

Я знаю, что я далеко, потому что он говорит, что @Result не был объявлен, но я не уверен, как объявить переменную, чтобы иметь возможность хранить результаты оператора SELECT.

Может кто-нибудь сказать мне, где я иду не так и как это исправить?

Спасибо,
Matt

Ответы [ 4 ]

2 голосов
/ 03 мая 2010

Вы можете использовать курсор, по крайней мере, это традиционный способ сделать это. Вы также можете использовать цикл while, как вы и просили. См. Эту статью для примера курсора и альтернативы.

Как избежать SQL-курсоров

1 голос
/ 03 мая 2010

Вместо того, чтобы думать с точки зрения зацикливания на результатах, внимательно посмотрите на часть «Делать вещи», посмотрите, сможете ли вы сделать все это за один шаг без зацикливания или курсоров.

Опубликуйте больше информации о фактической работе, которую вам нужно сделать, если можете, скорее всего, курсор не нужен.

1 голос
/ 03 мая 2010

Рассмотрите возможность использования табличных переменных вместо курсоров

http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=529

Конечно, вы всегда должны отдавать предпочтение операциям на основе множеств над любыми из них. SQL предназначен для операций на основе множеств.

0 голосов
/ 03 мая 2010

зацикливание - один из худших способов снизить производительность базы данных!

Я бы посоветовал вам попытаться обработать оператор select в одной команде, примерно так:

UPDATE t2
    SET Cola=t1.col1, Colb=t1.col2
    FROM UserInput t1
    JOIN YourTable t2 ON t1.id=t2.id

однако, если вы должны выполнить цикл, сделайте это следующим образом:

DECLARE @Current int, @LastRow int
DECLARE @Col1 datatype, @Col2 datatype ....
DECLARE @Results  table (RowId int identity1,1) primary key, col1 ...,col2 ...)

INSERT INTO @Results SELECT * FROM UserImport
SELECT @Current=0, @LastRow=@@ROWCOUNT

WHILE @Current<@LastRow
BEGIN
    SET @Current=@Current+1
    SELECT @Col1=Col1, @Col2=col2 FROM @Results WHERE RowId=@Current

   /* Do Stuff */

END

если вы обрабатываете более 100 строк, замените переменную таблицы: @Results на временную таблицу: #Results, например:

CREATE TABLE #RESULTS (RowId int identity1,1) primary key, col1 ...,col2 ...)

потому что это будет быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...