ISNUMERIC

htl258_Tony 2010-05-04 03:35:33
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-04 15:25:57
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Blog : http://blog.csdn.net/htl258
----------------------------------------------------------------------------------

--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[col] [nvarchar](10))
INSERT INTO [tb]
SELECT '1','1' UNION ALL
SELECT '2','3' UNION ALL
SELECT '3','1,2,3'

--SELECT * FROM [tb]

-->SQL查询如下:
select *,[isnum]=isnumeric(col) from tb
/*
id col isnum
----------- ---------- -----------
1 1 1
2 3 1
3 1,2,3 1

(3 行受影响)
*/
--直接用isnumeric判断,如果为1就可以与其它数值算术运算,看来运算的不是那么通畅
select case isnumeric(col) when 1 then col else 0 end+1 from tb
/*
-----------
2
4
消息 245,级别 16,状态 1,第 1 行
在将 nvarchar 值 '1,2,3' 转换成数据类型 int 时失败。
*/

--如果把“1,2,3”转为money,再与另一值相加,则可以成功。
select cast(col as money)+1 from tb
/*
---------------------
2.00
4.00
124.00

(3 行受影响)
*/
...全文
157 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
csw200201 2010-05-04
  • 打赏
  • 举报
回复
Easy fix:


CREATE FUNCTION dbo.SQL2KIsNumeric(@StringToTest nvarchar(max))
RETURNS int
AS
BEGIN
IF CHARINDEX(',', @StringToTest) > 0
BEGIN
RETURN 0
END

RETURN ISNUMERIC(@StringToTest)
END



Search and replace all reference to isnumeric with dbo.SQL2KIsNumeric
Yushangyuan 2010-05-04
  • 打赏
  • 举报
回复
进来学习
永生天地 2010-05-04
  • 打赏
  • 举报
回复
好像这个isnumeric是怪怪的
chuifengde 2010-05-04
  • 打赏
  • 举报
回复
2000的SP4补丁内部版本号最高的就是Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) 这个吗?怎么还会有8.00.2040
htl258_Tony 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yang_ 的回复:]
2005和2000不一样吧
[/Quote]
综合起来好像2005和2008一样,和2000的不一样。
Yang_ 2010-05-04
  • 打赏
  • 举报
回复
2005和2000不一样吧
chuifengde 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 josy 的回复:]
引用 15 楼 chuifengde 的回复:
7楼的sp4和12楼的sp4还不一样啊


一样的,操作系统不同而已
[/Quote]
搞错了,汗一个
Yang_ 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chuifengde 的回复:]
7楼的sp4和12楼的sp4还不一样啊
[/Quote]
7楼和12楼是一样的
百年树人 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chuifengde 的回复:]
7楼的sp4和12楼的sp4还不一样啊
[/Quote]

一样的,操作系统不同而已
htl258_Tony 2010-05-04
  • 打赏
  • 举报
回复
晕,难怪以前用的正常的一段代码今天出错了。
SQL77 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chuifengde 的回复:]
7楼的sp4和12楼的sp4还不一样啊
[/Quote]
........
chuifengde 2010-05-04
  • 打赏
  • 举报
回复
7楼的sp4和12楼的sp4还不一样啊
百年树人 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 htl258 的回复:]
引用 7 楼 chuifengde 的回复:
SQL code
SELECT @@VERSION
DECLARE @a table([id] [int],[col] [nvarchar](10))
INSERT INTO @a
SELECT '1','1' UNION ALL
SELECT '2','3' UNION ALL
SELECT '3','1,2,3'

-->SQL查……
[/Quote]

2005也是一样的
喜-喜 2010-05-04
  • 打赏
  • 举报
回复
学习....
百年树人 2010-05-04
  • 打赏
  • 举报
回复
SELECT @@VERSION
DECLARE @a table([id] [int],[col] [nvarchar](10))
INSERT INTO @a
SELECT '1','1' UNION ALL
SELECT '2','3' UNION ALL
SELECT '3','1,2,3'

-->SQL查询如下:
select * from @a where isnumeric(col)=1

/**
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Personal Edition on Windows NT 5.0 (Build 2195: Service Pack 4)


(1 行受影响)

(3 行受影响)

id col
----------- ----------
1 1
2 3

(2 行受影响)
**/
rmljoe 2010-05-04
  • 打赏
  • 举报
回复
哈哈 ,在SQL2000里正好相反。


select case isnumeric(col) when 1 then col else 0 end+1 from tb
/*
2
4
1

(所影响的行数为 3 行)
*/

--如果把“1,2,3”转为money,再与另一值相加,则可以成功。
select cast(col as money)+1 from tb
/*
---------------------
2.0000
4.0000

服务器: 消息 235,级别 16,状态 1,行 11
无法将 char 值转换为 money。该 char 值的语法有误。

*/
htl258_Tony 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chuifengde 的回复:]
SQL code
SELECT @@VERSION
DECLARE @a table([id] [int],[col] [nvarchar](10))
INSERT INTO @a
SELECT '1','1' UNION ALL
SELECT '2','3' UNION ALL
SELECT '3','1,2,3'

-->SQL查询如下:
select *,[isnum]=i……
[/Quote]难道是2008的BUG
chuifengde 2010-05-04
  • 打赏
  • 举报
回复
select cast(col as money)+1 from @a
--result
/**---------------------
2.0000
4.0000

服务器: 消息 235,级别 16,状态 1,行 10
无法将 char 值转换为 money。该 char 值的语法有误。
*/
--小F-- 2010-05-04
  • 打赏
  • 举报
回复
学习..围观
chuifengde 2010-05-04
  • 打赏
  • 举报
回复
SELECT @@VERSION
DECLARE @a table([id] [int],[col] [nvarchar](10))
INSERT INTO @a
SELECT '1','1' UNION ALL
SELECT '2','3' UNION ALL
SELECT '3','1,2,3'

-->SQL查询如下:
select *,[isnum]=isnumeric(col) from @a
/*

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Personal Edition on Windows NT 5.1 (Build 2600: Service Pack 3)


(所影响的行数为 1 行)


(所影响的行数为 3 行)

id col isnum
----------- ---------- -----------
1 1 1
2 3 1
3 1,2,3 0---这里

(所影响的行数为 3 行)
*/
加载更多回复(6)

27,579

社区成员

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

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