Пожалуйста, скажите мне, что я сплю или что-то в этом роде.
Я делаю oldschool tsql обход дерева без CTE. Вот мой стол с ванильными стеками.
CREATE TABLE #stack (DepartmentId int, level int)
Позже в коде цикла я столкнулся с проблемой, поэтому я посыпал код инструкциями Print и SELECT * FROM #stack. Вот соответствующая часть для этого вопроса
IF EXISTS (SELECT * FROM #stack WHERE level = @level)
BEGIN
PRINT 'First in the loop:'
SELECT * FROM #stack WHERE level = @level
PRINT 'Same query 1:'
SELECT * FROM #stack WHERE level = @level
Это выводит:
First in the loop:
DepartmentId level
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 1
No rows affected.
(1 row(s) returned)
Same query 1:
DepartmentId level
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NULL 1
No rows affected.
(1 row(s) returned)
Мой вопрос, очевидно, как может измениться содержимое первого столбца между двумя операторами выбора?
UPDATE:
Приведенный выше вывод получен при выполнении запроса из проекта базы данных в Visual Studio 2008.
Однако выполнение запроса из SQL Server Management Studio приводит к следующему результату:
First in the loop:
DepartmentId level
------------ -----------
NULL 1
Same query 1:
DepartmentId level
------------ -----------
NULL 1
Мой код находится недалеко от классической статьи msdn «Расширяющиеся иерархии», но я использую его для заполнения таблицы кеша идентификаторами вместо построения строк.
Я также запускаю транзакцию, подобную этой:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET XACT_ABORT ON
BEGIN TRANSACTION
РЕДАКТИРОВАТЬ 2:
Кажется, что цикл вносит вклад в путаницу, но основной виновник - это порядок операторов Print и операторов Select в Visual Studio.
Вот свернутый код, который выдает соответствующий вывод:
PRINT 'First in the loop:'
SELECT 'The order '
PRINT 'Same query 1:'
SELECT 'is quite puzzling'
PRINT 'Same query 2:'
SELECT 'isn´t it?'
Вот что выводит VS 2008:
Executing selected script from a_error_repro.sql
First in the loop:
Same query 1:
Column1
----------
The order
No rows affected.
(1 row(s) returned)
Same query 2:
Column1
------------
is quite puzzling.
No rows affected.
(1 row(s) returned)
Column1
---------
isn´t it?
No rows affected.
(1 row(s) returned)
Finished executing selected script from a_error_repro.sql
Похоже, что с содержимым временных таблиц у нас все хорошо, но порядок вывода операторов печати в VS 2008 немного беспокоит.
Я добавил отчет об ошибке в соответствии с рекомендациями Мартина. Спасибо. :)
https://connect.microsoft.com/VisualStudio/feedback/details/664137/wrong-output-order-of-print-vs-select-when-executing-sql-statements-in-visual-studio