无法使用t sql获取varchar

时间:2011-10-05 13:10:23

标签: sql tsql

我正在尝试从游标中的表中获取ID和序列号。作为测试,我编写了以下T-SQL

DECLARE @sensId AS int
DECLARE @serNo as varchar

DECLARE Sensor_Cursor CURSOR FOR
    SELECT  id, serNo
    FROM    sensor
    WHERE   serNo in ('000000002C507650', '0000000038507650', '0000000034507650', '0000000070507650', '0000000044507850', '00000000843060B0');
OPEN Sensor_Cursor;
FETCH NEXT FROM Sensor_Cursor
    INTO @sensId, @serNo;
WHILE @@FETCH_STATUS = 0
   BEGIN
    SELECT @sensId, @serNo
    FETCH NEXT FROM Sensor_Cursor
        INTO @sensId, @serNo;
   END;
CLOSE Sensor_Cursor;
DEALLOCATE Sensor_Cursor;

它返回:

59     0
60     0
61     0
62     0

为什么是零?我错过了什么?

查询:

SELECT  id, serNo
FROM    sensor
WHERE   serNo in ('000000002C507650', '0000000038507650', '0000000034507650', '0000000070507650', '0000000044507850', '00000000843060B0');

返回

id  serNo
59  000000002C507650
60  0000000038507650
61  0000000034507650
62  0000000070507650

3 个答案:

答案 0 :(得分:4)

我怀疑

DECLARE @serNo as varchar

默认为1的长度,即varchar(1)。相反,声明它是这样的:

DECLARE @serNo as varchar(20)

或其需要支持的最大长度。

答案 1 :(得分:1)

使用适当的长度声明varchar @serNo变量,例如

DECLARE @serNo as varchar(20)

答案 2 :(得分:0)

您需要定义varchar变量的长度。默认值为1个字符。

另外,游标通常是一件坏事,如果你有很多记录,如果你可以使用某种基于集合的处理,那就更好了。这可能会帮助您查看是否有更好的方法来执行您想要的操作: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them