15 个解决方案
#1
把错误的代码屏蔽掉可以么
如果出错了,是否会影响你的结果啊,继续执行有用么
如果出错了,是否会影响你的结果啊,继续执行有用么
#2
SQL中没有on error resume next 这样的功能
如果错误不严重,SQL自然会继续执行下去
如果是严重错误,SQL就会终止执行过程
如果错误不严重,SQL自然会继续执行下去
如果是严重错误,SQL就会终止执行过程
#3
使用 @@ERROR
如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:
在 Transact-SQL 语句后,马上检测或使用 @@ERROR。
在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。
在生成错误的批处理、存储过程或触发器中,@@ERROR 是 Microsoft® SQL Server™ 2000 错误的唯一可用部分。错误的所有其它部分,如严重度、状态、包含替换字符串(如对象名称)的消息文本,都只返回到那些能够用 API 错误处理机制进行错误处理的应用程序中。同时,@@ERROR 只由错误产生,而不由警告产生;因此,批处理、存储过程和触发器对于那些可能已经产生了的警告没有可见性。
@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为 0。完成每个 Transact-SQL 语句后,都要测试 @@ERROR 是否为 0。如果 @@ERROR 不是 0,将被存储在变量中。存储过程然后在 RETURN 语句中返回变量。如果过程中的 Transact-SQL 语句都没有错误,变量保持为 0。如果一个或多个语句生成错误,则变量包含最后的错误号。下面是有此逻辑的简单存储过程:
USE Northwind
GO
DROP PROCEDURE SampleProcedure
GO
-- Create a procedure that takes one input parameter
-- and returns one output parameter and a return code.
CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT,
@MaxQuantity INT OUTPUT
AS
-- Declare and initialize a variable to hold @@ERROR.
DECLARE @ErrorSave INT
SET @ErrorSave = 0
-- Do a SELECT using the input parameter.
SELECT FirstName, LastName, Title
FROM Employees
WHERE EmployeeID = @EmployeeIDParm
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Set a value in the output parameter.
SELECT @MaxQuantity = MAX(Quantity)
FROM [Order Details]
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Returns 0 if neither SELECT statement had
-- an error, otherwise returns the last error.
RETURN @ErrorSave
GO
也有 @@ERROR 与 @@ROWCOUNT 一起使用的时候。在以下的示例中,@@ERROR 用于确定是否出现违反约束的错误,而 @@ROWCOUNT 则在一些行被成功更改的情况下,用于确定由 UPDATE 语句修改的行数。
BEGIN TRAN
UPDATE Northwind.dbo.Products
SET UnitPrice = UnitPrice * 1.1
WHERE CategoryID IN (1, 2, 5, 6)
IF @@ERROR = 547
PRINT 'A CHECK CONSTRAINT violation occurred'
IF @@ROWCOUNT = 0
PRINT 'No rows updated.'
ELSE
PRINT STR(@@ROWCOUNT) + ' rows updated.'
COMMIT -- Commits rows successfully updated.
如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:
在 Transact-SQL 语句后,马上检测或使用 @@ERROR。
在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。
在生成错误的批处理、存储过程或触发器中,@@ERROR 是 Microsoft® SQL Server™ 2000 错误的唯一可用部分。错误的所有其它部分,如严重度、状态、包含替换字符串(如对象名称)的消息文本,都只返回到那些能够用 API 错误处理机制进行错误处理的应用程序中。同时,@@ERROR 只由错误产生,而不由警告产生;因此,批处理、存储过程和触发器对于那些可能已经产生了的警告没有可见性。
@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为 0。完成每个 Transact-SQL 语句后,都要测试 @@ERROR 是否为 0。如果 @@ERROR 不是 0,将被存储在变量中。存储过程然后在 RETURN 语句中返回变量。如果过程中的 Transact-SQL 语句都没有错误,变量保持为 0。如果一个或多个语句生成错误,则变量包含最后的错误号。下面是有此逻辑的简单存储过程:
USE Northwind
GO
DROP PROCEDURE SampleProcedure
GO
-- Create a procedure that takes one input parameter
-- and returns one output parameter and a return code.
CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT,
@MaxQuantity INT OUTPUT
AS
-- Declare and initialize a variable to hold @@ERROR.
DECLARE @ErrorSave INT
SET @ErrorSave = 0
-- Do a SELECT using the input parameter.
SELECT FirstName, LastName, Title
FROM Employees
WHERE EmployeeID = @EmployeeIDParm
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Set a value in the output parameter.
SELECT @MaxQuantity = MAX(Quantity)
FROM [Order Details]
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Returns 0 if neither SELECT statement had
-- an error, otherwise returns the last error.
RETURN @ErrorSave
GO
也有 @@ERROR 与 @@ROWCOUNT 一起使用的时候。在以下的示例中,@@ERROR 用于确定是否出现违反约束的错误,而 @@ROWCOUNT 则在一些行被成功更改的情况下,用于确定由 UPDATE 语句修改的行数。
BEGIN TRAN
UPDATE Northwind.dbo.Products
SET UnitPrice = UnitPrice * 1.1
WHERE CategoryID IN (1, 2, 5, 6)
IF @@ERROR = 547
PRINT 'A CHECK CONSTRAINT violation occurred'
IF @@ROWCOUNT = 0
PRINT 'No rows updated.'
ELSE
PRINT STR(@@ROWCOUNT) + ' rows updated.'
COMMIT -- Commits rows successfully updated.
#4
或者把存储过程分成两个
EXEC sp1
GO
EXEC sp2
GO
这样后面得存储过程就不受前面的影响
EXEC sp1
GO
EXEC sp2
GO
这样后面得存储过程就不受前面的影响
#5
--下面演示了SQL错误处理的脆弱性
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--调用
exec p1
go
--删除测试
drop proc p1
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
对象名 'newid' 无效。
--*/
/*--结论1:
错误1,不是严重的错误,所以SQL会执行下去
错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果
--*/
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--调用
exec p1
go
--删除测试
drop proc p1
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
对象名 'newid' 无效。
--*/
/*--结论1:
错误1,不是严重的错误,所以SQL会执行下去
错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果
--*/
#6
--下面演示了SQL错误处理的脆弱性
--演示2,存储过程嵌套调用中的错误
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--测试的存储过程2
create proc p2
as
exec p1
if @@error<>0
print '调用 存储过程1 异常结束'
else
print '调用 存储过程1 正常结束'
go
--调用
exec p2
go
--删除测试
drop proc p1,p2
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
对象名 'newid' 无效。
调用 存储过程1 异常结束
--*/
/*--结论2:
被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去
--*/
--演示2,存储过程嵌套调用中的错误
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--测试的存储过程2
create proc p2
as
exec p1
if @@error<>0
print '调用 存储过程1 异常结束'
else
print '调用 存储过程1 正常结束'
go
--调用
exec p2
go
--删除测试
drop proc p1,p2
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
对象名 'newid' 无效。
调用 存储过程1 异常结束
--*/
/*--结论2:
被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去
--*/
#7
所以楼主可以用存储过程嵌套的方法来解决你的问题.
#8
谢谢各位大侠!
我的错误出在我想将一部分字符串convert成数字的操作上。如果字符串不规范,convert一定会出错的。我想这可能属于严重错误。请问有没有什么函数可以先判断字符串是不是数字的?
我的错误出在我想将一部分字符串convert成数字的操作上。如果字符串不规范,convert一定会出错的。我想这可能属于严重错误。请问有没有什么函数可以先判断字符串是不是数字的?
#9
--可以啊
select case isnumeric('要转换的字符串') when 1 then convert(int,'要转换的字符串') else null end
select case isnumeric('要转换的字符串') when 1 then convert(int,'要转换的字符串') else null end
#10
ISNUMERIC
确定表达式是否为一个有效的数字类型。
语法
ISNUMERIC ( expression )
参数
expression
要计算的表达式。
返回类型
int
注释
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。
示例
A. 使用 ISNUMERIC
下面的示例返回 1,这是因为 zip 列包含有效的数值。
USE pubs
SELECT ISNUMERIC(zip)
FROM authors
GO
B. 使用 ISNUMERIC 和 SUBSTRING
下面的示例对于 titles 表中的所有书名都返回 0,这是因为没有一个书名是有效的数值。
USE pubs
GO
-- Because the title column is all character data, expect a result of 0
-- for the ISNUMERIC function.
SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)
FROM titles
GO
确定表达式是否为一个有效的数字类型。
语法
ISNUMERIC ( expression )
参数
expression
要计算的表达式。
返回类型
int
注释
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。
示例
A. 使用 ISNUMERIC
下面的示例返回 1,这是因为 zip 列包含有效的数值。
USE pubs
SELECT ISNUMERIC(zip)
FROM authors
GO
B. 使用 ISNUMERIC 和 SUBSTRING
下面的示例对于 titles 表中的所有书名都返回 0,这是因为没有一个书名是有效的数值。
USE pubs
GO
-- Because the title column is all character data, expect a result of 0
-- for the ISNUMERIC function.
SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)
FROM titles
GO
#11
下一版的sqlserver(2005)将支持try catch
#12
SET XACT_ABORT ON
BEGIN TRY
BEGIN TRAN
-- your code goes here
COMMIT TRAN
END TRY
BEGIN CATCH TRAN_ABORT
DECLARE @err AS INT
SET @err = @@error
IF @err = <error id 1>
BEGIN
-- Handle error 1
END
ELSE IF @err = <error id 2>
BEGIN
-- Handle error 2
END
-- ... other errors ...
ELSE
BEGIN
-- Handle unexpected error
END
IF @@trancount > 0 ROLLBACK
END CATCH
BEGIN TRY
BEGIN TRAN
-- your code goes here
COMMIT TRAN
END TRY
BEGIN CATCH TRAN_ABORT
DECLARE @err AS INT
SET @err = @@error
IF @err = <error id 1>
BEGIN
-- Handle error 1
END
ELSE IF @err = <error id 2>
BEGIN
-- Handle error 2
END
-- ... other errors ...
ELSE
BEGIN
-- Handle unexpected error
END
IF @@trancount > 0 ROLLBACK
END CATCH
#13
if you want to see it's content,please open this links http://msdn.microsoft.com/msdnmag/issues/04/02/TSQLinYukon/default.aspx
#14
学习
#15
谢谢各位大侠。问题已经解决。
#1
把错误的代码屏蔽掉可以么
如果出错了,是否会影响你的结果啊,继续执行有用么
如果出错了,是否会影响你的结果啊,继续执行有用么
#2
SQL中没有on error resume next 这样的功能
如果错误不严重,SQL自然会继续执行下去
如果是严重错误,SQL就会终止执行过程
如果错误不严重,SQL自然会继续执行下去
如果是严重错误,SQL就会终止执行过程
#3
使用 @@ERROR
如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:
在 Transact-SQL 语句后,马上检测或使用 @@ERROR。
在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。
在生成错误的批处理、存储过程或触发器中,@@ERROR 是 Microsoft® SQL Server™ 2000 错误的唯一可用部分。错误的所有其它部分,如严重度、状态、包含替换字符串(如对象名称)的消息文本,都只返回到那些能够用 API 错误处理机制进行错误处理的应用程序中。同时,@@ERROR 只由错误产生,而不由警告产生;因此,批处理、存储过程和触发器对于那些可能已经产生了的警告没有可见性。
@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为 0。完成每个 Transact-SQL 语句后,都要测试 @@ERROR 是否为 0。如果 @@ERROR 不是 0,将被存储在变量中。存储过程然后在 RETURN 语句中返回变量。如果过程中的 Transact-SQL 语句都没有错误,变量保持为 0。如果一个或多个语句生成错误,则变量包含最后的错误号。下面是有此逻辑的简单存储过程:
USE Northwind
GO
DROP PROCEDURE SampleProcedure
GO
-- Create a procedure that takes one input parameter
-- and returns one output parameter and a return code.
CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT,
@MaxQuantity INT OUTPUT
AS
-- Declare and initialize a variable to hold @@ERROR.
DECLARE @ErrorSave INT
SET @ErrorSave = 0
-- Do a SELECT using the input parameter.
SELECT FirstName, LastName, Title
FROM Employees
WHERE EmployeeID = @EmployeeIDParm
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Set a value in the output parameter.
SELECT @MaxQuantity = MAX(Quantity)
FROM [Order Details]
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Returns 0 if neither SELECT statement had
-- an error, otherwise returns the last error.
RETURN @ErrorSave
GO
也有 @@ERROR 与 @@ROWCOUNT 一起使用的时候。在以下的示例中,@@ERROR 用于确定是否出现违反约束的错误,而 @@ROWCOUNT 则在一些行被成功更改的情况下,用于确定由 UPDATE 语句修改的行数。
BEGIN TRAN
UPDATE Northwind.dbo.Products
SET UnitPrice = UnitPrice * 1.1
WHERE CategoryID IN (1, 2, 5, 6)
IF @@ERROR = 547
PRINT 'A CHECK CONSTRAINT violation occurred'
IF @@ROWCOUNT = 0
PRINT 'No rows updated.'
ELSE
PRINT STR(@@ROWCOUNT) + ' rows updated.'
COMMIT -- Commits rows successfully updated.
如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:
在 Transact-SQL 语句后,马上检测或使用 @@ERROR。
在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。
在生成错误的批处理、存储过程或触发器中,@@ERROR 是 Microsoft® SQL Server™ 2000 错误的唯一可用部分。错误的所有其它部分,如严重度、状态、包含替换字符串(如对象名称)的消息文本,都只返回到那些能够用 API 错误处理机制进行错误处理的应用程序中。同时,@@ERROR 只由错误产生,而不由警告产生;因此,批处理、存储过程和触发器对于那些可能已经产生了的警告没有可见性。
@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为 0。完成每个 Transact-SQL 语句后,都要测试 @@ERROR 是否为 0。如果 @@ERROR 不是 0,将被存储在变量中。存储过程然后在 RETURN 语句中返回变量。如果过程中的 Transact-SQL 语句都没有错误,变量保持为 0。如果一个或多个语句生成错误,则变量包含最后的错误号。下面是有此逻辑的简单存储过程:
USE Northwind
GO
DROP PROCEDURE SampleProcedure
GO
-- Create a procedure that takes one input parameter
-- and returns one output parameter and a return code.
CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT,
@MaxQuantity INT OUTPUT
AS
-- Declare and initialize a variable to hold @@ERROR.
DECLARE @ErrorSave INT
SET @ErrorSave = 0
-- Do a SELECT using the input parameter.
SELECT FirstName, LastName, Title
FROM Employees
WHERE EmployeeID = @EmployeeIDParm
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Set a value in the output parameter.
SELECT @MaxQuantity = MAX(Quantity)
FROM [Order Details]
-- Save any non-zero @@ERROR value.
IF (@@ERROR <> 0)
SET @ErrorSave = @@ERROR
-- Returns 0 if neither SELECT statement had
-- an error, otherwise returns the last error.
RETURN @ErrorSave
GO
也有 @@ERROR 与 @@ROWCOUNT 一起使用的时候。在以下的示例中,@@ERROR 用于确定是否出现违反约束的错误,而 @@ROWCOUNT 则在一些行被成功更改的情况下,用于确定由 UPDATE 语句修改的行数。
BEGIN TRAN
UPDATE Northwind.dbo.Products
SET UnitPrice = UnitPrice * 1.1
WHERE CategoryID IN (1, 2, 5, 6)
IF @@ERROR = 547
PRINT 'A CHECK CONSTRAINT violation occurred'
IF @@ROWCOUNT = 0
PRINT 'No rows updated.'
ELSE
PRINT STR(@@ROWCOUNT) + ' rows updated.'
COMMIT -- Commits rows successfully updated.
#4
或者把存储过程分成两个
EXEC sp1
GO
EXEC sp2
GO
这样后面得存储过程就不受前面的影响
EXEC sp1
GO
EXEC sp2
GO
这样后面得存储过程就不受前面的影响
#5
--下面演示了SQL错误处理的脆弱性
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--调用
exec p1
go
--删除测试
drop proc p1
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
对象名 'newid' 无效。
--*/
/*--结论1:
错误1,不是严重的错误,所以SQL会执行下去
错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果
--*/
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--调用
exec p1
go
--删除测试
drop proc p1
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
对象名 'newid' 无效。
--*/
/*--结论1:
错误1,不是严重的错误,所以SQL会执行下去
错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果
--*/
#6
--下面演示了SQL错误处理的脆弱性
--演示2,存储过程嵌套调用中的错误
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--测试的存储过程2
create proc p2
as
exec p1
if @@error<>0
print '调用 存储过程1 异常结束'
else
print '调用 存储过程1 正常结束'
go
--调用
exec p2
go
--删除测试
drop proc p1,p2
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
对象名 'newid' 无效。
调用 存储过程1 异常结束
--*/
/*--结论2:
被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去
--*/
--演示2,存储过程嵌套调用中的错误
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'
select * from newid()
if @@error<>0
print '发生错误2'
go
--测试的存储过程2
create proc p2
as
exec p1
if @@error<>0
print '调用 存储过程1 异常结束'
else
print '调用 存储过程1 正常结束'
go
--调用
exec p2
go
--删除测试
drop proc p1,p2
/*--测试结果
服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
对象名 'newid' 无效。
调用 存储过程1 异常结束
--*/
/*--结论2:
被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去
--*/
#7
所以楼主可以用存储过程嵌套的方法来解决你的问题.
#8
谢谢各位大侠!
我的错误出在我想将一部分字符串convert成数字的操作上。如果字符串不规范,convert一定会出错的。我想这可能属于严重错误。请问有没有什么函数可以先判断字符串是不是数字的?
我的错误出在我想将一部分字符串convert成数字的操作上。如果字符串不规范,convert一定会出错的。我想这可能属于严重错误。请问有没有什么函数可以先判断字符串是不是数字的?
#9
--可以啊
select case isnumeric('要转换的字符串') when 1 then convert(int,'要转换的字符串') else null end
select case isnumeric('要转换的字符串') when 1 then convert(int,'要转换的字符串') else null end
#10
ISNUMERIC
确定表达式是否为一个有效的数字类型。
语法
ISNUMERIC ( expression )
参数
expression
要计算的表达式。
返回类型
int
注释
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。
示例
A. 使用 ISNUMERIC
下面的示例返回 1,这是因为 zip 列包含有效的数值。
USE pubs
SELECT ISNUMERIC(zip)
FROM authors
GO
B. 使用 ISNUMERIC 和 SUBSTRING
下面的示例对于 titles 表中的所有书名都返回 0,这是因为没有一个书名是有效的数值。
USE pubs
GO
-- Because the title column is all character data, expect a result of 0
-- for the ISNUMERIC function.
SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)
FROM titles
GO
确定表达式是否为一个有效的数字类型。
语法
ISNUMERIC ( expression )
参数
expression
要计算的表达式。
返回类型
int
注释
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。
示例
A. 使用 ISNUMERIC
下面的示例返回 1,这是因为 zip 列包含有效的数值。
USE pubs
SELECT ISNUMERIC(zip)
FROM authors
GO
B. 使用 ISNUMERIC 和 SUBSTRING
下面的示例对于 titles 表中的所有书名都返回 0,这是因为没有一个书名是有效的数值。
USE pubs
GO
-- Because the title column is all character data, expect a result of 0
-- for the ISNUMERIC function.
SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)
FROM titles
GO
#11
下一版的sqlserver(2005)将支持try catch
#12
SET XACT_ABORT ON
BEGIN TRY
BEGIN TRAN
-- your code goes here
COMMIT TRAN
END TRY
BEGIN CATCH TRAN_ABORT
DECLARE @err AS INT
SET @err = @@error
IF @err = <error id 1>
BEGIN
-- Handle error 1
END
ELSE IF @err = <error id 2>
BEGIN
-- Handle error 2
END
-- ... other errors ...
ELSE
BEGIN
-- Handle unexpected error
END
IF @@trancount > 0 ROLLBACK
END CATCH
BEGIN TRY
BEGIN TRAN
-- your code goes here
COMMIT TRAN
END TRY
BEGIN CATCH TRAN_ABORT
DECLARE @err AS INT
SET @err = @@error
IF @err = <error id 1>
BEGIN
-- Handle error 1
END
ELSE IF @err = <error id 2>
BEGIN
-- Handle error 2
END
-- ... other errors ...
ELSE
BEGIN
-- Handle unexpected error
END
IF @@trancount > 0 ROLLBACK
END CATCH
#13
if you want to see it's content,please open this links http://msdn.microsoft.com/msdnmag/issues/04/02/TSQLinYukon/default.aspx
#14
学习
#15
谢谢各位大侠。问题已经解决。