当动态T-SQL语句遇到除零的问题
2009-06-12 00:48
399 查看
该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!陈希章原文地址:http://www.cnblogs.com/chenxizhang/archive/2009/02/06/1385435.html原文标题:当动态T-SQL语句遇到除零的问题 原文发表:2009/2/6 8:54:00 |
那么,能不能够有一个什么方法,忽略某个别的公式错误,继续执行T-SQL语句呢?可惜的是,T-SQL并没有类似ISError的函数
我自己写了一个函数,代码如下,实际上我是将其解释成CASE WHEN语句
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[ProcessFormula](@formula VARCHAR(4000))
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @startindex INT, @index INT,@tempindex INT,@minindex INT
SET @startindex=0
SET @index=CHARINDEX('/',@formula,@startindex) --该函数是从1开始编号的
IF @index=0 --如果找不到除号的话,则直接返回
RETURN @formula
--如果至少找到一个除号,那么继续往下执行
DECLARE @tempformula VARCHAR(4000)
DECLARE @foundcount INT
SET @foundcount=0
SET @tempformula='CASE WHEN '
WHILE @index >0 --进入一个循环,来查找所有的除号
BEGIN
SET @foundcount=@foundcount+1
IF SUBSTRING(@formula,@index+1,1)='(' --如果除号右侧是一个括号的话
BEGIN
--注意,这里可能会有括号嵌套的情况
--首先找到最近的一个右括号)
SET @tempindex=CHARINDEX(')',@formula,@index+1)
DECLARE @count INT
DECLARE @temp VARCHAR(256)
SET @temp=SUBSTRING(@formula,@index+1,@tempindex-@index+1)
SET @count=LEN(@temp)-LEN(REPLACE(@temp,'(',''))
IF @count >1
BEGIN
WHILE @count>1
BEGIN
SET @tempindex=CHARINDEX(')',@formula,@tempindex+1)
SET @count=@count-1
END
SET @temp=SUBSTRING(@formula,@index+1,@tempindex-@index+1)
END --只有一个左括号,则直接返回该字符串
IF @foundcount>1
SET @tempformula=@tempformula + ' OR ' +@temp +' =0 '
ELSE
SET @tempformula=@tempformula +@temp +' =0 '
IF @tempindex=len(@formula) --如果最后一个括号是公式的末尾,则退出循环
SET @index=-1
ELSE
SET @index=@tempindex+1
END ELSE
BEGIN
SET @minindex=0 --初始化该变量为0,如果处理完四个步骤,都没有改变该值,则表示后面没有其他的运算符了
--如果不是一个括号,则继续向后面查找+,-,*,/这几个字符的位置
SET @tempindex=CHARINDEX('+',@formula,@index+1)
IF @tempindex>0
SET @minindex=@tempindex
SET @tempindex=CHARINDEX('-',@formula,@index+1)
IF (@tempindex>0)
BEGIN
IF @minindex>0 AND @tempindex<@minindex
SET @minindex=@tempindex
ELSE IF @minindex=0
SET @minindex=@tempindex
END
SET @tempindex=CHARINDEX('*',@formula,@index+1)
IF (@tempindex>0)
BEGIN
IF @minindex>0 AND @tempindex<@minindex
SET @minindex=@tempindex
ELSE IF @minindex=0
SET @minindex=@tempindex
END SET @tempindex=CHARINDEX('/',@formula,@index+1)
IF (@tempindex>0)
BEGIN
IF @minindex>0 AND @tempindex<@minindex
SET @minindex=@tempindex
ELSE IF @minindex=0
SET @minindex=@tempindex
END IF @minindex=0
BEGIN
DECLARE @formulalength INT
SET @formulalength=LEN(@formula)
IF @foundcount>1
SET @tempformula=@tempformula + ' OR ' +SUBSTRING(@formula,@index+1,@formulalength-@index+1) +' =0 '
ELSE
SET @tempformula=@tempformula +SUBSTRING(@formula,@index+1,@formulalength-@index+1) +' =0 '
SET @index=-1 --将这个变量设置小于0,退出循环
END
ELSE
BEGIN
IF @foundcount>1
SET @tempformula=@tempformula + ' OR ' +SUBSTRING(@formula,@index+1,@minindex-@index-1) +' =0 '
ELSE
SET @tempformula=@tempformula +SUBSTRING(@formula,@index+1,@minindex-@index-1) +' =0 '
SET @index=@tempindex
END
END
END RETURN @tempformula +' THEN 0 ELSE ' + @formula +' END'
END 测试的结果如下图
作者:陈希章 出处:http://blog.csdn.net/chen_xizhang 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
相关文章推荐
- 当动态T-SQL语句遇到除零的问题
- 面试中遇到的sql语句行列转换问题
- 关于用SQL语句Sql2008数据库的备份与还原常遇到的问题
- 哪位帮我看看这个SQL语句错在什么地方,总是提示我insert into语句的语法错误[呵呵遇到了同样的问题]
- 使用Hibernate 5.0、4.0、3.0 createSQLQuery执行原生Sql语句 遇到问题及解决办法集锦
- sql比较字符的,Mybatis中遇到的符号转化,sql比较语句问题!
- 关于执行Oracle下Sql语句中遇到的特殊字符问题解决办法。
- 开发中遇到的一个关于 SQL 语句执行的问题
- Mysql的sql语句中使用判断语句遇到的问题
- 关于用SQL语句Sql2008数据库的备份与还原常遇到的问题
- sql语句之表间字段值复制遇到的一些问题--基于mysql
- MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题 X
- 关于统计的一个sql问题,使用动态sql语句实现。
- Hibernate中多表联合查询遇到的问题(原生态的SQL语句解决办法)
- JAVA中数据库操作中sql语句遇到的问题
- 使用Rocker模板引擎解决动态拼接SQL语句的问题
- 在ORM框架中使用原生sql语句进行聚合查询遇到的问题
- 关于统计的一个sql问题,使用动态sql语句实现。
- 【求助】使用SQL语句优化工具遇到的问题
- 动态sql中使用select into语句出错问题