现在有一张表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 ,赋给变量后,变量的值还是原来的。