当前位置: 代码迷 >> Sql Server >> 帮忙看看这个循环语句的有关问题
  详细解决方案

帮忙看看这个循环语句的有关问题

热度:30   发布时间:2016-04-24 09:30:46.0
帮忙看看这个循环语句的问题
现在有一张表test,源码:

IF OBJECT_ID('test') IS NOT NULL
DROP TABLE test;
GO
CREATE TABLE test
(id INT ,
 an INT);
INSERT INTO test VALUES (2,12);
INSERT INTO test VALUES (3,3);
INSERT INTO test VALUES (5,2);
INSERT INTO test VALUES (7,1);
SELECT * FROM dbo.test;

id an
2 12
3 3
5 2
7 1
现在将表进行加工 ,查询如下形式信息:
a b
第1次 12
第2次 3
第3次 0
第4次 2
第5次 0
第6次 1
第7次 0
第8次 0
第9次 0
第10次 0
我是这样实行的,看源码:

DECLARE @n INT,
        @an INT ,
        @a VARCHAR(10);
BEGIN
IF OBJECT_ID('#t') IS NOT NULL
DROP TABLE #t;
CREATE TABLE #t
(a VARCHAR(10),
 b INT );
 SET @n=2;
 WHILE @n<=11
   BEGIN
     SELECT @an=an FROM dbo.test WHERE id=@n;
     SET @a='第'+CAST(@n-1 AS VARCHAR(5))+'次';
     INSERT INTO #t
             ( a, b )
     VALUES  ( @a,ISNULL(@an,0)
               );
     SET @n=@n+1;
   END;
SELECT * FROM #t
END;

但结果却是:
a b
第1次 12
第2次 3
第3次 3
第4次 2
第5次 2
第6次 1
第7次 1
第8次 1
第9次 1
第10次 1
当n=4的时候,@na应该查不到值的,为null的,但是不知道为什么它却为1,还有n=9,n=10的时候 全是1,请问这是问什么啊??高手请帮忙解答。

------解决思路----------------------
DECLARE @an INT 
SET @an = 1
SELECT @an = number FROM master..spt_values WHERE 1=0
SELECT @an
SET @an = (SELECT MIN(number) FROM master..spt_values WHERE 1=0)
SELECT @an

           
-----------
          1

(1 行受影响)

           
-----------
       NULL

(1 行受影响)

SELECT @an 条件不满足时时不会赋NULL值的。
------解决思路----------------------
查不到數據和數據為null是兩個不同的概念。
也就是當id=3時,在test表中找不到數據,此時@an的值沒有更改過,還是為上一次賦值後的數據,即id=2時的@an的數據“3”。
可以試一下下面的sql。

DECLARE @n INT,
        @an INT ,
        @a VARCHAR(10);
BEGIN
IF OBJECT_ID('#t') IS NOT NULL
DROP TABLE #t;
CREATE TABLE #t
(a VARCHAR(10),
 b INT );
 SET @n=2;
 WHILE @n<=11
   BEGIN
       set @an=0
        SELECT @an=an FROM dbo.test WHERE id=@n;
        SET @a='第'+CAST(@n-1 AS VARCHAR(5))+'次';
        INSERT INTO #t
                ( a, b )
        VALUES  ( @a,@an
                  );
        SET @n=@n+1;
   END;
SELECT * FROM #t
END;

------解决思路----------------------
很简单的方法
select a.number, isnull(b.an, 0) from (select number from master..spt_values
where number >= 1 and number <=10
group by number) a left join test b on b.id = a.number + 1
 order by number
------解决思路----------------------

select '第' + convert(varchar, a.number) + '次', isnull(b.an, 0) from (select number from master..spt_values
where number >= 1 and number <=10
group by number) a left join test b on b.id = a.number + 1
 order by number
------解决思路----------------------

--把 这句
        SELECT @an=an FROM dbo.test WHERE id=@n;
--改成
        SELECT @an=isnull(max(an),0) FROM dbo.test WHERE id=@n;

-- 原因: 如果没有查询到记录行,就会返回 NULL ,赋给变量后,变量的值还是原来的。
  相关解决方案