[向ALL提问]每日一个小问题 3

claro 2010-07-30 05:10:21
--该脚本返回的计数值是什么? (在SQL2005默认配置环境下)

DECLARE @Count int,
@String nvarchar(max),
@i int;

SELECT @Count = 0,
@String = '',
@i = 0;

WHILE @i <= 127
BEGIN
IF ISNUMERIC(CHAR(@i)) = 1
BEGIN
SET @Count = @Count + 1;
SET @String = @String +
CHAR(@i) +
'(' + CAST(@i as nvarchar(3)) + '), ';
END
SET @i = @i + 1;
END

SELECT @Count AS "Count", @String AS String;

--Choose your answer:
10
16
21
29
128

请您将结果贴在回复中。7日后结贴!
...全文
333 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
feilniu 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 feixianxxx 的回复:]

其实就是ISNUMERIC 不太好用 ...
[/Quote]

这函数的判断规则确实太复杂了。
wsh236 2010-08-09
  • 打赏
  • 举报
回复
21 (9), (10), (11), (12), (13), $(36), +(43), ,(44), -(45), .(46), 0(48), 1(49), 2(50), 3(51), 4(52), 5(53), 6(54), 7(55), 8(56), 9(57), \(92),


claro 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 beirut 的回复:]
在2000下就是20
我的结果也是20,2k 斜杠CHAR(92) (\)返回0
不知道能看到不
[/Quote]了解,谢谢小爱。
因为题目已说明(在SQL2005默认配置环境下),所以。。
黄_瓜 2010-08-08
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 claro 的回复:]

引用 23 楼 sql77 的回复:

SQL code
Count String ……
[/Quote]
在2000下就是20
我的结果也是20,2k 斜杠CHAR(92) (\)返回0
不知道能看到不
claro 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 sql77 的回复:]

SQL code
Count String ……
[/Quote]非常不解的是你怎么得到20的呢?SQL77。。我尝试更改配置也没有实现。
feixianxxx 2010-08-02
  • 打赏
  • 举报
回复
其实就是ISNUMERIC 不太好用 ...
claro 2010-08-02
  • 打赏
  • 举报
回复
select 
ISNUMERIC(CHAR(0)) [0]
,ISNUMERIC(CHAR(1)) [1]
,ISNUMERIC(CHAR(2)) [2]
,ISNUMERIC(CHAR(3)) [3]
,ISNUMERIC(CHAR(4)) [4]
,ISNUMERIC(CHAR(5)) [5]
,ISNUMERIC(CHAR(6)) [6]
,ISNUMERIC(CHAR(7)) [7]
,ISNUMERIC(CHAR(8)) [8] --以上返回0,以下返回1
, ISNUMERIC(CHAR(9)) [9]
, ISNUMERIC(CHAR(10)) [10]
, ISNUMERIC(CHAR(11)) [11]
, ISNUMERIC(CHAR(12)) [12]
, ISNUMERIC(CHAR(13)) [13]
, ISNUMERIC(CHAR(36)) [36]
, ISNUMERIC(CHAR(43)) [43]
, ISNUMERIC(CHAR(44)) [44]
, ISNUMERIC(CHAR(45)) [45]
, ISNUMERIC(CHAR(46)) [46]
, ISNUMERIC(CHAR(92)) [92]

--result:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 36 43 44 45 46 92
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1


--对于ISNUMERIC函数返回结果1的首要条件是表达式必须为有效的 numeric 数据类型。
对于ASCII码来说,从48到57都满足它,从而返回结果1.
--对于不是数字的字符(如加号 (+)、减号 (-))和有效货币符号(如美元符号 ($))字符,ISNUMERIC 也将返回 1。
更细心,更深入的朋友可以发现在所有的256个ASCII码中,让ISNUMERIC返回1的字符类型还有一个扩展ASCII码:欧元 €(128)。

总结:ISNUMERIC 返回 1的表达式中对于不是数字字符的有
水平制表符CHAR(9)、换行键CHAR(10)、垂直制表符CHAR(11)、换页键CHAR(12)、回车键CHAR(13)、
加号CHAR(43) (+)、逗号CHAR(44)(,)、减号CHAR(45) (-)、句号CHAR(46) (.)、斜杠CHAR(92) (\)
和有效货币符号美元符号CHAR(36) ($)、欧元符号CHAR(128) (€)、


--ASCII 码相关定义及说明:
ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。
标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号,
以及在美式英语中使用的特殊控制字符。其中:
  0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),
如控制符:LF(换行)、CR(回车)、 FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;
通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;
ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。
它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
  32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字;
  65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
  同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。
所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。
奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;
偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
  后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。
扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。


--以上信息分别来自
MSSQL 联机丛书

百度百科
http://baike.baidu.com/view/15482.htm

ASCII 码以及扩展 ASCII 码表
http://www.idevelopment.info/data/Programming/ascii_table/PROGRAMMING_ascii_table.shtml
claro 2010-08-02
  • 打赏
  • 举报
回复
很多朋友问出题的目的是什么?
除了探讨、学习,还能认识这么多有想法、善于创新的朋友、高手,何乐而不为。

结果显而易见,真正的原因只有亲力亲为的理解才有效果,理解的深度同样在思考和实践过程中逐步完成。

claro 2010-08-02
  • 打赏
  • 举报
回复
因近期公司出游,故提前结贴。
superpander 2010-08-02
  • 打赏
  • 举报
回复
学习...
老七 2010-08-02
  • 打赏
  • 举报
回复
guguda2008 2010-08-02
  • 打赏
  • 举报
回复
额?貌似想错了,这个应该是指出ISNUMERIC对货币符号也是返回1,至于为什么CHAR(10)和CHAR(13)也返回1我就不懂了。
junjun1984 2010-08-02
  • 打赏
  • 举报
回复
帮顶~
guguda2008 2010-08-02
  • 打赏
  • 举报
回复
DECLARE @Count int,
@String nvarchar(max),
@i int;

SELECT @Count = 0,
@String = '',
@i = 0;

WHILE @i <= 127
BEGIN
IF ISNUMERIC(CHAR(@i)) = 1
BEGIN
SET @Count = @Count + 1;
SET @String = @String +
+CHAR(@I)+','+CAST(@i AS CHAR(2)) +
'(' + CAST(@i as nvarchar(3)) + '), ';
END
SET @i = @i + 1;
END

SELECT @Count AS "Count", @String AS String;
/*
21 ,9 (9), ,10(10), ,11(11), ,12(12), ,13(13), $,36(36), +,43(43), ,,44(44), -,45(45), .,46(46), 0,48(48), 1,49(49), 2,50(50), 3,51(51), 4,52(52), 5,53(53), 6,54(54), 7,55(55), 8,56(56), 9,57(57), \,92(92),
*/
guguda2008 2010-08-02
  • 打赏
  • 举报
回复
CHAR函数返回的是CHAR(1),@I转过来以后被截断了。用CAST(@I AS CHAR(2))可以避免这个问题。
sych888 2010-08-02
  • 打赏
  • 举报
回复
up..............
wsxcdx 2010-08-02
  • 打赏
  • 举报
回复
看不懂,学习
黄_瓜 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 claro 的回复:]
对于本质,希望深刻理解。
对于问题,希望准确答题。
[/Quote]
没理解,也没答对,版本不同
楼主给解释一下吧
claro 2010-08-02
  • 打赏
  • 举报
回复
让我看到更多高手
badi888 2010-08-01
  • 打赏
  • 举报
回复
21
不知道lz出这道题的目的?
加载更多回复(44)

11,849

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧