`
gaofen100
  • 浏览: 1189788 次
文章分类
社区版块
存档分类
最新评论

我的SQL Server函数为什么结果不对(使用CHAR/VARCHAR要定义长度,不然默认长度为1)

 
阅读更多
  1. 语句
    select 'K'+substring(cast([收费起点桩号]as char),0,charindex('.', cast([收费起点桩号]as char)))+'+'+substring(cast([收费起点桩号]as char),charindex('.', cast([收费起点桩号]as char))+1,4) as 收费起点桩号
    from tb_fs_公路收费站分布情况表

    返回的结果是正确的,假如[收费起点桩号]是200.020 ,则结果为K200+020,如果[收费起点桩号]是310.520,则结果为
    K310+520。
    但是我把合成字符串的提取为函数再调用(select CovertToStakeNO([收费起点桩号]) from tb_fs_公路收费站分布情况表 )后,结果却非预期值:如果[收费起点桩号]是200.020,则返回2,如果[收费起点桩号]是310.520,则返回3。函数体如下:

  2. --Description:将real型的桩号转换为桩号形式
  3. --=============================================
  4. alterfunctionCovertToStakeNO
  5. (
  6. @StakeNOColumnNamereal
  7. )
  8. RETURNSnchar
  9. AS
  10. BEGIN
  11. declare@tostringnchar(10);
  12. declare@indexofpointint;
  13. set@tostring=(selectcast(@StakeNOColumnNameaschar));
  14. set@indexofpoint=charindex('.',@tostring);
  15. return@tostring--('K'+substring(@tostring,0,@indexofpoint)+'+'+substring(@tostring,@indexofpoint+1,4))
  16. END
  17. GO

最终改为:

  1. alterfunctionCovertToStakeNO
  2. (
  3. @StakeNOColumnName decimal(8,3)
  4. )
  5. RETURNSnchar(20)
  6. AS
  7. BEGIN
  8. declare@tostringnchar(20);
  9. declare@indexofpointint;
  10. set@tostring=(selectcast(@StakeNOColumnNameaschar));
  11. set@indexofpoint=charindex('.',@tostring);
  12. return@tostring--('K'+substring(@tostring,0,@indexofpoint)+'+'+substring(@tostring,@indexofpoint+1,4))
  13. END
  14. GO


出错原因:
1)使用CHAR/VARCHAR要定义长度,不然默认长度为1,也就是为什么得到1个字符的原因
2)[收费起点桩号]数据类型我记错了,不是real ,而是decimal(8,3)



分享到:
评论

相关推荐

    sqlserver自定义函数

    --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) END select ...

    SQL Server字符串处理函数大全

    这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。 left()是sql函数。 select 字段1 from 表1 where charindex('云',字段1)=1; 字符串函数对二进制数据、字符串和表达式执 行...

    MYSQL,SQLSERVER,ORACLE常用的函数

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- ...

    SQl 函数说明大全

    1.聚合函数 执行的操作是将多个值合并为一个值。例如 COUNT、SUM、MIN 和 MAX。 2.配置函数 是一种标量函数,可返回有关配置设置的信息。 3.转换函数 将值从一种数据类型转换为另一种。 4.加密函数 支持加密、解密、...

    Sqlserver中char,nchar,varchar与Nvarchar的区别分析

    1. char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(10),那么不论你存储的数据是否达 到了10个字节,都要占去10个字节的空间...

    SQL SERVER 2000开发与管理应用实例

    14.3.2 将所有的char、varchar改为nchar、nvarchar 445 14.3.3 标识列与普通列的相互转换 447 14.3.4 把列添加指定位置 450 14.3.5 在两个SQL Server数据库之间复制对象 451 第 15 章 SQL Server应用...

    MySQL中字段类型char、varchar和text的区别

    必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用...

    浅析Oracle中char和varchar2的区别

    char是定长的 char(10) varchar2(10) 同样存 a ,char占用了10个字符,varchar2 ... 您可能感兴趣的文章:oracle to_char函数将number转成stringOracle to_char函数的使用方法SQL中Charindex和Oracle中对应的函数Instr

    sql 函数大全 比较常用的一些函数整理第1/2页

    select语句中只能使用sql函数对字段进行操作(链接sql server),select 字段1 from 表1 where 字段1.IndexOf(“云”)=1;这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。left()是...

    Sqlserver 常用日期时间函数

    MS SQL Server中文版的预设日期datetime格式是yyyy-mm-dd hh:mm:ss.mmm 长短日期格式 代码如下: –短日期格式:yyyy-m-d SELECT REPLACE(CONVERT(varchar(10),getdate(),120),N’-0′,’-‘) –长日期格式:yyyy年mm...

    Oracle内置SQL函数-分类整理大全

    这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值....当在过程性语句中使用时,它们可以被赋值给VARCHAR2或者CHAR类型的PL/SQL变量.

    sqlserver2000基础(高手也有用)

    14.3.2 将所有的char、varchar改为nchar、nvarchar 445 14.3.3 标识列与普通列的相互转换 447 14.3.4 把列添加指定位置 450 14.3.5 在两个SQL Server数据库之间复制对象 451 第 15 章 SQL Server应用疑难...

    详解SQL Server中的数据类型

    SQL Server支持两种字符数据类型,一种是常规,另外一种则是Unicode。常规数据类型包括CHAR和VARCHAR,Unicode数据类型包括NCAHR和NVARCHAR。常规字符的每个字符使用1个字节存储,而Unicode数据的每个字符要求2个...

    导出创建用户下各个对象数据结构的sql语句的脚本,包括表、视图、索引、约束等等

    适用的数据库:8i, 9i数据库下该脚本通用<br/><br/>功能:导出一个用户的数据结构,包括表、视图、索引、约束、存储过程、触发器、函数、序列等等的定义,并且每个定义为一个文件<br/> 导出的各个对象的定义格式比较...

    SQL字符串处理函数大全

    select语句中只能使用sql函数对字段进行操作(链接sql server),select 字段1 from 表1 where 字段1.IndexOf(“云”)=1;这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。left()是...

    经典SQL语句大全

    1、1=1,1=2的使用,在SQL语句组合时用的较多 “where 1=1” 是表示选择全部 “where 1=2”全部不选, 如: if @strWhere !='' begin set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + ...

    PL/SQL 基础.doc

    CHAR 定长(例子:CHAR(5) 如果不够5个字符的话就会用空白填充 ) ,可以不带长度规定(默认为1) VARCHAR2 变长((VARCHAR2(5)标识最长可以保存5个字符) 后面的长度规定必须要有 布尔型、BOOLEAN 日期型; DATE(后增加...

    ORACLE数据库sql语言 、函数及常用命令

    例如:列SAGE1、SAGE2的内容为空,列SAGE3内容为20,则下面的逻辑表达式全部为NULL:SAGE1=SAGE2、SAGE1<>SAGE2、SAGE1=SAGE3、SAGE3>SAGE1。下面的逻辑表达式全部为真:SAGE1 IS NULL、SAGE3 IS NOT NULL。下列...

    SQL2005中char nchar varchar nvarchar数据类型的区别和使用环境讲解

    字符数据类型(nchar 长度固定,nvarchar 长度可变)和 Unicode 数据使用 UNICODE UCS-2 字符集。 nchar [ ( n ) ] n 个字符的固定长度的 Unicode 字符数据。n 值必须在 1 到 4,000 之间(含)。存储大小为两倍 n ...

    SQLServer中字符串左对齐或右对齐显示的sql语句

    知识点: 函数 replicate 以下代码是实现如下功能: 代码如下: declare @sql varchar(200), –需填充的字符串 @char varchar(4), –填充使用的字符 @len int –填充后的长度 select @sql=’abc’ select @char=’ ...

Global site tag (gtag.js) - Google Analytics