Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL脚本在完成查询构建循环后拒绝继续_Sql_Sql Server_Tsql_Variables_Loops - Fatal编程技术网

T-SQL脚本在完成查询构建循环后拒绝继续

T-SQL脚本在完成查询构建循环后拒绝继续,sql,sql-server,tsql,variables,loops,Sql,Sql Server,Tsql,Variables,Loops,我的数据库中有一个表,可以每天自动记录进度。 这个脚本。。。 1.从此历史记录表中选择所有不同的分包商,并将其插入到表变量中。 2.选择历史记录表中的所有不同日期。 3.将查询构建为varchar,以插入每个分包商制造商的每日吨位 4.尝试打印以筛选生成的变量 5.执行注释掉的nvarchar'd SQL use database666 -- in-memory employee table to hold distinct PHFabricator DECLARE @i int; DECLA

我的数据库中有一个表,可以每天自动记录进度。 这个脚本。。。 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;
产出:

just work dammit

omfg

哪里出错了?

看起来您将NULL和一个导致NULL的字符串连接在一起。这将在整个算法中传播空值。您可以使用ISNULL函数来替换适当的字符串,例如空字符串或文本字符串NULL来替换NULL值

空值可能是从变量表的末尾掉下来的。尝试将WHILE语句更改为:

WHILE (@f < (SELECT COUNT(*) FROM @SubbsTable))

看起来您正在连接NULL和一个导致NULL的字符串。这将在整个算法中传播空值。您可以使用ISNULL函数来替换适当的字符串,例如空字符串或文本字符串NULL来替换NULL值

空值可能是从变量表的末尾掉下来的。尝试将WHILE语句更改为:

WHILE (@f < (SELECT COUNT(*) FROM @SubbsTable))

转到查询选项并将CONCAT\u NULL\u YIELDS\u NULL设置为false,然后查看是否得到输出。如果是这样,您的一个表达式的计算结果可能为null


注意:除了诊断,我不建议将其设置为false,这是一种连接级别设置,可能会导致难以调试生产过程中的错误。

转到查询选项,将CONCAT\u NULL\u YIELDS\u NULL设置为false,然后查看是否得到输出。如果是这样,您的一个表达式的计算结果可能为null


注意:我不建议将其设置为false(诊断除外),这是一种连接级别设置,可能会导致难以调试生产过程中的错误。

SQL server优化查询的执行,何时执行查询的不同部分取决于它。特别是,不能保证打印语句的执行顺序与您的其他语句相同。5年前,当我发现这一事实时,这让我感到惊讶,但从那时起,这一点就没有改变。解决方法是在print语句中包含一个变量。在这种情况下,直到变量值变为可用时,才会执行print语句。SQL server会优化查询的执行,何时执行查询的不同部分取决于它。特别是,不能保证打印语句的执行顺序与您的其他语句相同。5年前,当我发现这一事实时,这让我感到惊讶,但从那时起,这一点就没有改变。解决方法是在print语句中包含一个变量。在这种情况下,直到变量值变为可用时才会执行print语句。编辑:我是个白痴,没有把你的评论读到底。这就是问题所在,谢谢!变量表只返回最后一行以外的所有行,因此它一定是删除了结尾。再次感谢!编辑:我是个白痴,没有把你的评论读到最后。这就是问题所在,谢谢!变量表只返回最后一行以外的所有行,因此它一定是删除了结尾。再次感谢!我试过了,它给我指出了正确的方向,那就是我的表变量在循环的末尾被割礼了。Thank=我试过了,它为我指明了正确的方向,即我的表变量在循环的末尾被割礼。谢谢=