Странное поведение из переменной счетчика внутри цикла курсора - PullRequest
0 голосов
/ 01 октября 2019

В SQL я использую переменную-счетчик для увеличения числового значения, которое записывается в столбец NewForm. Значением счетчика иногда является число, а чаще всего звездочки. Ожидаемые результаты для звездочек должны быть значением счетчика. Почему это происходит?

Код, который я использую ниже:

DECLARE @id INT
DECLARE @form INT
DECLARE @counter INT
DECLARE @cursor CURSOR

WITH FRM AS
(
    SELECT RunlistIx AS Id, Form, TransitDays, Quantity, '0' AS NewForm
    FROM Runlist
    WHERE (UserId = N'095a6c66-238e')
)
SELECT * 
INTO #tmp 
FROM FRM;

SET @counter = 1;

SET @cursor = CURSOR FOR
    SELECT Id, Form 
    FROM #tmp
    WHERE (NewForm = 0)
    ORDER BY transitdays DESC

OPEN @cursor

FETCH NEXT FROM @cursor INTO @id, @form

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE #tmp
    SET NewForm = @counter
    WHERE Form = @form  

    FETCH NEXT FROM @cursor INTO @id, @form
    SET @counter = @counter + 1;    
END

SELECT * 
FROM #tmp;

DROP TABLE #tmp

CLOSE @cursor
DEALLOCATE @cursor

Ниже приведены результаты:

+=====+======+=============+==========+=========+
| Id  | Form | TransitDays | Quantity | NewForm |
+=====+======+=============+==========+=========+
| 961 |    8 |           4 |     7000 | *       |
| 962 |   11 |           4 |     1750 | *       |
| 963 |   12 |           3 |    93000 | 9       |
| 964 |   19 |           3 |     8750 | 3       |
| 965 |    1 |           3 |     5250 | *       |
| 966 |   13 |           3 |    24500 | 8       |
| 967 |    3 |           3 |     1750 | 7       |
| 968 |    3 |           3 |     1750 | 7       |
| 969 |   13 |           3 |    26250 | 8       |
| 970 |   12 |           3 |   101500 | 9       |
| 971 |   11 |           3 |     1750 | *       |
| 972 |    8 |           3 |     7000 | *       |
| 973 |    1 |           3 |     5250 | *       |
| 974 |    2 |           3 |     3500 | *       |
| 975 |   14 |           3 |     1750 | *       |
| 976 |   14 |           3 |     1750 | *       |
| 977 |   15 |           3 |     1750 | *       |
| 978 |    2 |           3 |     3500 | *       |
| 979 |   15 |           3 |     1750 | *       |
| 980 |   16 |           3 |     1750 | *       |
| 981 |   16 |           3 |     1750 | *       |
| 982 |   17 |           3 |     1750 | *       |
| 983 |   17 |           3 |     1750 | *       |
| 984 |   10 |           3 |     3500 | *       |
| 985 |    9 |           3 |     5250 | *       |
| 986 |    5 |           2 |     3500 | *       |
| 987 |    4 |           2 |     5250 | *       |
| 988 |    6 |           2 |     1750 | *       |
| 989 |    6 |           2 |     1750 | *       |
| 990 |    4 |           2 |     5250 | *       |
| 991 |   18 |           2 |     1750 | *       |
+-----+------+-------------+----------+---------+

1 Ответ

2 голосов
/ 01 октября 2019

Ваша проблема в том, что вы создаете таблицу #tmp с NewForm как char(1)

SELECT RunlistIx AS Id, Form, TransitDays, Quantity, '0' AS NewForm
FROM   Runlist

Поскольку вам требуется целочисленный столбец, он должен быть просто 0 as NewForm без одинарных кавычек,Исправленный запрос выглядит следующим образом.

SELECT RunlistIx AS Id, Form, TransitDays, Quantity, 0 AS NewForm
FROM   Runlist

Кроме того, здесь нет необходимости использовать курсор. Это можно просто сделать с помощью набора запросов. А для @counter просто используйте row_number() для генерации работающего runber

SELECT  RunlistIx AS Id, Form, TransitDays, Quantity, 
        row_number() over (order by TransitDays desc)  AS NewForm
into    #tmp
FROM    Runlist
WHERE   (UserId = N'095a6c66-238e')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...