В моей базе данных есть таблица, которая автоматически записывает прогресс изо дня в день.
Этот сценарий ...
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
Куда я иду не так?