我的数据库中有一个表,可以自动记录每天的进度。 这个脚本...... 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;
总而言之,您会注意到整个代码中的一些打印语句,而不仅仅是接近结尾的语句。所有这些工作,查询按预期构建,我最终每个制造商一行,在历史表中每个日期具有制造商的ID和一个吨位列。 但是在最后一个循环之后,它似乎没有保留任何可变数据:
print 'just work dammit';
print 'omg ' + @TonnageTableQuery + ' omg';
print 'omfg';
输出:
just work dammit
omfg
我哪里错了?
答案 0 :(得分:1)
看起来你正在连接NULL和一个导致NULL的字符串。这将在整个算法中传播NULLness。您可以使用ISNULL函数将适当的字符串(如空字符串或文字字符串NULL)替换为NULL值。
NULL可能来自变量表末尾的下降。尝试将WHILE语句更改为:
WHILE (@f < (SELECT COUNT(*) FROM @SubbsTable))
答案 1 :(得分:0)
转到查询选项并将CONCAT_NULL_YIELDS_NULL设置为false,看看是否可以输出。如果是这样,你的一个表达式可能正在评估为null。
NB 除了诊断之外,我不建议将其设置为false,这是连接级别设置,可能导致生产过程难以调试错误。