Foxtable(狐表)用户栏目专家坐堂 → sql中为什么查询与用print输出的值不一样?


  共有3823人关注过本帖树形打印复制链接

主题:sql中为什么查询与用print输出的值不一样?

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
sql中为什么查询与用print输出的值不一样?  发帖心情 Post By:2021/7/29 11:28:00 [只看该作者]

--查询某表中各字段的最大长度
 DECLARE my_cursor CURSOR SCROLL
 FOR
    SELECT  name
    FROM    syscolumns
    WHERE   id = OBJECT_ID('tabDIYTable55');
 OPEN my_cursor;
 DECLARE @colname NVARCHAR(16);
 DECLARE @value INT;
 FETCH NEXT FROM my_cursor
        INTO @colname;
 WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT  @value = MAX(LEN(@colname))
        FROM    JBL.dbo.tabDIYTable55;
        PRINT @colname + '  最大长度为:  '; 
        PRINT  @value  显示不一样
        FETCH NEXT FROM my_cursor
            INTO @colname;
    END;
 CLOSE my_cursor;
 DEALLOCATE my_cursor;
 
 --SELECT  MAX(LEN(F720)) FROM    JBL.dbo.tabDIYTable55;

如上用最下面的语句查询出来F20字段的最大长度是17,但print @Value 显示的是5?

什么原因?
谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/29 11:52:00 [只看该作者]


[此贴子已经被作者于2021/7/29 20:12:26编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2021/7/29 18:43:00 [只看该作者]

没明白,我是把某个表的每一列查询放在游标里面,然后遍历从这个表中查询每一列的最大值的长度,
SELECT  @value = MAX(LEN(@colname))
        FROM    JBL.dbo.tabDIYTable55;
上面这名的意思是在表中查询某列的最大长度放在变量@Value里,然后下面print这个@value,
这样写不对吗,那正确的应该如何写

谢谢!


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/29 20:16:00 [只看该作者]

2楼说错了,我们换种方式来理解,到数据库执行下面代码,会发现值是不一样的。

DECLARE @colname NVARCHAR(16);
set @colname = '第六列';
select max(len(@colname)) from [dbo].[表A]
select max(len(第六列)) from [dbo].[表A]

因为第一个select其实计算的是@colname这个变量的值表示的长度,值是“第六列”,长度永远是3,计算的是第六列”这个字符串的长度,而不是指第六列这个列里所有单元格的值的最大长度

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2021/7/29 22:06:00 [只看该作者]

因为在前台更新数据时总提示截断字符的错误,都是因为设定表的字段长度不够,
现在一个字段一个字段去查询,效率太慢了,就是想要一次性查询出某个表中的每一列的字段中的最大长度值要如何才能实现?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/29 22:21:00 [只看该作者]

查列的定义长度也不是这样查的


select
obj. name,
col. name  as  ColumnName,
col.max_length  as  DataLength,
col.is_nullable  as  IsNullable
from  sys.objects obj
inner  join  sys.columns col
on  obj.object_id=col.object_id
where  obj.name ='表A'

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2021/7/29 23:48:00 [只看该作者]

老师误会我的意思了,不是要查每个字段的定义的长度,而是要查表中每个字段实际的字段的最大长度
也就是  select max(len(订单编号)) from 订单 查出来的长度,如果表有20列,就是按每一列的名称查询出其保存的最大值的长度

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/30 8:37:00 [只看该作者]

如果是这个问题【因为在前台更新数据时总提示截断字符的错误,都是因为设定表的字段长度不够,】

就应该是6楼的方式,查列的定义长度才有用啊。也就是下面的字符长度
图片点击可在新窗口打开查看

 回到顶部