Can';t使用t sql获取varchar

Can';t使用t sql获取varchar,sql,tsql,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', '0000000

我试图从游标中的表中获取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
我怀疑

DECLARE @serNo as varchar
默认长度为1,即varchar(1)。相反,声明如下:

DECLARE @serNo as varchar(20)
或者它需要支撑的最大长度。

我怀疑

DECLARE @serNo as varchar
默认长度为1,即varchar(1)。相反,声明如下:

DECLARE @serNo as varchar(20)

或者它需要支持的最大长度。

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

此外,游标通常是一件坏事,如果您可以使用某种基于集合的处理,尤其是当您有大量记录时,效果会更好。这可能会帮助您了解是否有更好的方法来实现您的目标:
您需要定义varchar变量的长度。默认值为1个字符

此外,游标通常是一件坏事,如果您可以使用某种基于集合的处理,尤其是当您有大量记录时,效果会更好。这可能会帮助您了解是否有更好的方法来实现您的目标:
声明具有适当长度的varchar@serNo变量,如

DECLARE @serNo as varchar(20)

声明具有适当长度的varchar@serNo变量,如

DECLARE @serNo as varchar(20)

这是正确的根据。Per BOL:当数据定义或变量声明语句中未指定n时,默认长度为1。如果不使用CAST函数指定n,则默认长度为30。+1,如果不指定varchar长度,则节省2秒,则会花费数小时尝试调试问题!这是正确的根据。Per BOL:当数据定义或变量声明语句中未指定n时,默认长度为1。如果不使用CAST函数指定n,则默认长度为30。+1,如果不指定varchar长度,则节省2秒,则会花费数小时尝试调试问题!我知道,但这是一个偶尔的类型查询,所以我很容易做到。谢谢。我知道,但这是一个偶尔的类型查询,所以我做得很简单。谢谢。我想您使用游标的原因没有说明,在示例中并不明显。是的,我发布了一个精简查询,只显示了我遇到问题的区域。原来的要复杂得多。我想您使用游标的原因没有说明,在示例中并不明显。是的,我发布了一个精简查询,只显示了我遇到问题的区域。原作要复杂得多。