SQL Loop печаль - PullRequest
       1

SQL Loop печаль

0 голосов
/ 15 декабря 2011

Использование Microsoft SQL 2008 У меня есть цикл, который должен собирать данные из каждой строки, но кажется, что он захватывает только последнюю строку.Таблица:

CREATE TABLE [dbo].[TEST](
    [PK] [int] NULL,
    [ITEMS] [varchar](50) NULL
) ON [PRIMARY]

insert into dbo.test (pk, items) values (1, '1111')
insert into dbo.test (pk, items) values (2, '2222')
insert into dbo.test (pk, items) values (3, '3333')
insert into dbo.test (pk, items) values (4, '4444')

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

-- Get the number of rows in the looping table
DECLARE @RowCount INT
SET @RowCount = (SELECT COUNT(ITEMS) FROM dbo.TEST) 

Print @ROWCOUNT

-- Declare an iterator
DECLARE @I INT
-- Initialize the iterator
SET @I = 1

--Loop through the rows of a table 
WHILE (@I <= @RowCount)

BEGIN

Declare @Name varchar(100)

SELECT @Name = Lower(ITEMS) FROM dbo.TEST


PRINT 'Row No = ' + CONVERT(VARCHAR(2), @I)

Print @Name

-- Increment the iterator
        SET @I = @I  + 1

END

Я получаю результатыполучить:

4
Row No = 1
4444
Row No = 2
4444
Row No = 3
4444
Row No = 4

Кажется достаточно простым, но я не могу найти никакой информации о том, почему это происходит, и / или обдумать цикл и почему он не работает.Спасибо, Хизер

Ответы [ 2 ]

3 голосов
/ 15 декабря 2011

Ваша проблема в

SELECT @Name = Lower(ITEMS) FROM dbo.TEST 

Как написано, он будет читать все строки в таблице ... но @Name может быть назначено только одно значение. Вам нужно предложение where, например:

SELECT @Name = Lower(ITEMS) FROM dbo.TEST 
WHERE PK = @I
2 голосов
/ 15 декабря 2011

Как отметил Филипп Келли, SELECT @Name = Lower(ITEMS) FROM dbo.TEST всегда даст вам последний элемент в результате. Таким образом, его решение (добавление WHERE PK = @I) будет работать, если PK в таблице начинаются с 1 и являются последовательными. Если какое-либо из этих условий не выполняется, вам придется сделать что-то подобное.

;WITH CTE as 
(SELECT row_number() over (order by pk) rn, items
FROM dbo.TEST)
SELECT @Name = Lower(items) FROM CTE where rn = @i

Хотя, честно говоря, вам, вероятно, лучше с курсором FAST_FORWARD, так как вы уже проиграли битву на основе операций над множествами.

См. Этот data.se запрос для рабочего примера (обратите внимание, я добавил еще один элемент 6,'6666')

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