Я работал над курсором, который выглядит ниже. Я использую SQL Server 2008 R2.Почему сервер sql не может очистить локальный параметр, объявленный в курсоре при циклировании?
Declare @Pnr nvarchar(7)
DECLARE db_cursor CURSOR FOR
SELECT B.Pnr FROM SomeTable B
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @Pnr
WHILE @@FETCH_STATUS = 0
BEGIN
/*some stuff*/
declare @Remark nvarchar(max)
SELECT @Remark=COALESCE(@Remark + ', ', '') + Remark from OtherTable where [email protected]
/*some stuff*/
FETCH NEXT FROM db_cursor INTO @Pnr
END
CLOSE db_cursor
DEALLOCATE db_cursor
Я думал, что @Remark
будет нулевым снова, если он объявлен каждый цикл. Но запрос сохраняет прежнее значение, если он получает значение null для @Remark
Решение просто, я могу установить нуль для каждого цикла, но мне интересно, почему объявление не очищает локальную переменную в цикле.
Пример:
OtherTable
--------------
Pnr | Remark
---------------
2 | aaaaaaaa
2 | bbbbbbbb
2 | cccccccc
3 | qqqqqqqq
3 | wwwwwwww
Результаты:
Pnr | Remark
------------
1 | NULL
2 | aaaaaaaa, bbbbbbbb, cccccccc
3 | qqqqqqqq, wwwwwwww
4 | qqqqqqqq, wwwwwwww = should be NULL
5 | qqqqqqqq, wwwwwwww = should be NULL
Объявления переменных не участвуют в потоке управления вообще в T-SQL. Это одна из восхитительных «особенностей» этого языка. –
Действительно. Я думал об этом, как о других языках программирования. Спасибо! – esatemre