Скрипт T-SQL отказывается продолжать после завершения цикла построения запроса - PullRequest
1 голос
/ 03 мая 2011

В моей базе данных есть таблица, которая автоматически записывает прогресс изо дня в день. Этот сценарий ... 1. Выбирает всех отдельных субподрядчиков из этой таблицы истории и вставляет их в переменную таблицы. 2. Выбирает все отдельные даты в таблице истории. 3. Создает запрос как varchar для добавления ежедневного тоннажа на субподрядчика (изготовителя) 4. Попытки вывести на экран встроенную переменную 5. Выполняет nvarchar'd SQL (закомментировано)

use database666
-- in-memory employee table to hold distinct PHFabricator 
DECLARE @i int;
DECLARE @f int;
DECLARE @CreateTonnageTableQuery NVARCHAR(MAX);
DECLARE @TonnageTableQuery VARCHAR(MAX);
DECLARE @CurrentTonnageQuery VARCHAR(MAX);

DECLARE @SubbsTable TABLE ( sdx int Primary Key IDENTITY(1,1), OrgID int);
DECLARE @DatesTable TABLE ( idx int Primary Key IDENTITY(1,1), History_date datetime);
INSERT @SubbsTable SELECT distinct PHFabricator FROM tblpackagehistory ORDER BY PHFabricator;
INSERT @DatesTable SELECT distinct PHHistory_Date FROM tblpackagehistory ORDER BY PHHistory_Date;

SET @CreateTonnageTableQuery = 'DECLARE @TonnageTable TABLE ([Fabricator_ID] int primary key';
SET @i = 1;
WHILE (@i <= (SELECT COUNT(*) FROM @DatesTable))
BEGIN
    SET @CreateTonnageTableQuery = @CreateTonnageTableQuery + ', [' + (SELECT 'COL'+CONVERT(varchar(6),idx) FROM @DatesTable WHERE idx = @i) + '] float';
    SET @i = @i + 1;
END
SET @CreateTonnageTableQuery = @CreateTonnageTableQuery + '); ' + CHAR(13)+CHAR(10);

DECLARE @currentSubbie int
DECLARE @currentDate datetime
SET @TonnageTableQuery = '';
SET @CurrentTonnageQuery = '';
SET @f = 0
WHILE (@f <= (SELECT COUNT(*) FROM @SubbsTable))
BEGIN
    SET @f = @f + 1;
    SET @currentSubbie = (SELECT OrgID FROM @SubbsTable WHERE sdx = @f);
    SET @CurrentTonnageQuery = 'INSERT INTO @TonnageTable VALUES (' + CONVERT(varchar(6),@currentSubbie);
    SET @i = 1;
    WHILE (@i <= (SELECT COUNT(*) FROM @DatesTable))
    BEGIN
        SET @currentDate = (SELECT History_date FROM @DatesTable WHERE idx = @i); 
        SET @CurrentTonnageQuery = @CurrentTonnageQuery + ', ' + 
        (   SELECT CONVERT(varchar(20),(sum(PHIssued_Tonnage * PHPercent_Overall_Fabricated))) 
            FROM tblpackagehistory 
            WHERE PHFabricator = @currentSubbie AND PHHistory_Date = @currentDate           
        );
        SET @i = @i + 1;
    END
    SET @CurrentTonnageQuery = @CurrentTonnageQuery + '); ' + CHAR(13)+CHAR(10);
    PRINT @CurrentTonnageQuery;
    SET @TonnageTableQuery = @TonnageTableQuery + @CurrentTonnageQuery;
    PRINT CHAR(13)+CHAR(10) + @TonnageTableQuery + CHAR(13)+CHAR(10);
END
print 'just work dammit';
print 'omg ' + @TonnageTableQuery + ' omg';
print 'omfg';
--DECLARE @statement nvarchar(max);
--SET @statement = @CreateTonnageTableQuery + @TonnageTableQuery + 'SELECT * FROM @TonnageTable;';
--EXEC sp_executesql @statement;

Подводя итог, вы можете заметить некоторые операторы печати во всем коде, а не только в конце. Все эти работы, запрос строится, как задумано, я получаю по одной строке на производителя, с идентификатором производителя и одним столбцом тоннажа на дату в таблице истории. Однако после последнего цикла он, похоже, не сохраняет никаких переменных данных:

print 'just work dammit';
print 'omg ' + @TonnageTableQuery + ' omg';
print 'omfg';

выходы:

just work dammit

omfg

Куда я иду не так?

Ответы [ 2 ]

1 голос
/ 03 мая 2011

Похоже, что вы объединяете NULL и строку, которая приводит к NULL. Это распространит NULLness по всему вашему алгоритму. Вы можете использовать функцию ISNULL для замены подходящей строки (например, пустой строки или литеральной строки NULL) значением NULL.

Возможно, NULL будет падать с конца таблицы переменных. Попробуйте изменить выражение WHILE на:

WHILE (@f < (SELECT COUNT(*) FROM @SubbsTable))
0 голосов
/ 03 мая 2011

Перейдите к параметрам запроса и задайте для CONCAT_NULL_YIELDS_NULL значение false и посмотрите, получится ли это на выходе. Если так, то одно из ваших выражений, вероятно, оценивается как ноль.

NB Я не рекомендую оставлять его в значении false, кроме как для диагностики, это настройка уровня соединения и может привести к трудностям при отладке ошибок для рабочих процессов.

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