Печать против выбора порядка вывода в Visual Studio (было: Временные таблицы SQL изменяются самостоятельно ???) - PullRequest
1 голос
/ 22 апреля 2011

Пожалуйста, скажите мне, что я сплю или что-то в этом роде.

Я делаю 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

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

Проблема не была ни в коде, ни в таблицах. Это была проблема с порядком вывода операторов print против операторов select в visual studio.

См .: https://connect.microsoft.com/VisualStudio/feedback/details/664137/wrong-output-order-of-print-vs-select-when-executing-sql-statements-in-visual-studio

0 голосов
/ 22 апреля 2011

Возможно, данные вашего второго выбора находятся вне области видимости (измените одиночный знак # на 2 # и посмотрите, получите ли вы тот же результат.).Поскольку это выглядит странно с кодом, который вы показали, пожалуйста, добавьте еще немного кода.

...