请问SQL Server中编写类似cast的函数,其特征传递各种类型都可以处理,这样的函数是怎么编的?

moshangchen 2004-09-23 12:41:08
请问SQL Server中编写类似cast的函数,其特征传递各种类型都可以处理,这样的函数是怎么编的?
能编成通用的系统函数,我想,我在函数中也可以编写类似的函数,不知通过什么来写?
...全文
184 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andy__Huang 2004-09-23
  • 打赏
  • 举报
回复
cast、convert這兩個函數已經很用了﹐干嘛還要自己寫啊﹖

如果自己寫你也要用到這個函數的
pbsql 2004-09-23
  • 打赏
  • 举报
回复
有现成的cast、convert,为什么要自己编呢?
moshangchen 2004-09-23
  • 打赏
  • 举报
回复
呵呵,解决谢谢,马上结贴
pbsql 2004-09-23
  • 打赏
  • 举报
回复
to_char(@number numeric)
——》
to_char(@number numeric(18,6))
zjcxc 2004-09-23
  • 打赏
  • 举报
回复
sql_variant
一种存储 SQL Server 支持的各种数据类型(text、ntext、image、timestamp 和 sql_variant 除外)值的数据类型。

sql_variant 可以用在列、参数和变量中并返回用户定义函数的值。sql_variant 允许这些数据库对象支持其它数据类型的值。

语法
sql_variant

注释
sql_variant 类型的列可以包含不同数据类型的行。例如,定义为 sql_variant 的列可以存储 int、binary 和 char 值。不能使用 sql_variant 存储的值类型只有 text、ntext、image、timestamp 和 sql_variant。

sql_variant 的最大长度可达 8016 字节。

必须先将 sql_variant 数据类型投影为其基本数据类型值,才能使其参与加和减这类运算。

可以给 sql_variant 赋一个默认值。该数据类型还可以将 NULL 作为其基础值,但是 NULL 值没有关联的基本类型。另外,sql_variant 还可以不将其它 sql_variant 作为其基本类型。

UNIQUE、主键或外键可以包含 sql_variant 类型列,但是包含给定行键的数据值总长度不应大于索引的最大长度(目前是 900 字节)。

表可以有任意多个 sql_variant 列。

sql_variant 不能在 CONTAINSTABLE 和 FREETEXTTABLE 中使用。

ODBC 不完全支持 sql_variant。因此,当使用用于 ODBC 的 Microsoft OLE DB 提供程序 (MSDASQL) 时,sql_variant 列的查询作为二进制数据返回。例如,包含字符串数据 'PS2091' 的 sql_variant 列作为 0x505332303931 返回。

比较 sql_variant 值
sql_variant 数据类型属于用于转换的数据类型层次结构列表的顶部。为了比较 sql_variant 值,SQL Server 数据类型层次结构顺序划分为数据类型系列。

数据类型层次结构 数据类型系列
sql_variant sql_variant
datetime datetime
smalldatetime datetime
float 近似数
real 近似数
decimal 精确数
money 精确数
smallmoney 精确数
bigint 精确数
int 精确数
smallint 精确数
tinyint 精确数
bit 精确数
nvarchar Unicode
nchar Unicode
varchar Unicode
char Unicode
varbinary binary
binary binary
uniqueidentifier uniqueidentifier


适用于 sql_variant 比较的规则如下:

当具有不同基本数据类型的 sql_variant 值进行比较,而且基本数据类型属于不同的数据类型系列时,在层次结构图中数据类型系列较高的值,被认为在二者中值较大。


当具有不同基本数据类型的 sql_variant 值进行比较,而且基本数据类型属于相同的数据类型系列,在层次结构图中基本数据类型比较低的值先隐性转换成其它数据类型,然后再进行比较。


当比较具有 char、varchar、nchar 或 varchar 数据类型的 sql_variant 值时,将基于以下准则对它们进行比较:LCID、LCID 版本、比较标志和排序 ID。这些准则中的每一个都作为整型值并按列出的顺序进行比较。
zjcxc 2004-09-23
  • 打赏
  • 举报
回复
为什么放着sql现成的 sql_variant 类型不用呢?

如果你不用这种类型,写参数就时候就已经定义好了类型,那转换就没有意义了.
zjcxc 2004-09-23
  • 打赏
  • 举报
回复
--可以这样嘛

create function dbo.to_char(
@number sql_variant
)returns varchar(4000)
as
begin
return cast(@number as varchar(4000))
end
go

--调用
select dbo.to_char(234.43543)
go

--删除测试
drop function to_char

/*--测试结果

---------------------------
234.43543

(所影响的行数为 1 行)

--*/
moshangchen 2004-09-23
  • 打赏
  • 举报
回复
不可以的,我试了,比方说:我想封装一个函数,to_char(各种数值),你说把他定于成to_char(@number numeric),其实是不行的,如果这样传递的有的带两位小数就会被割掉,
select dbo.to_char(234.43543) 结果是234 ,我的实现如下您在看看:
create function dbo.to_char (@number numeric)
returns varchar(4000)
as
begin
return cast(@number as varchar(4000))
end
pbsql 2004-09-23
  • 打赏
  • 举报
回复
那是因为他们都是数字

如果仅满足这样的要求,那你把它设为numeric/dicimal就可以了,int/bigint/float等都可传
moshangchen 2004-09-23
  • 打赏
  • 举报
回复
请问楼上:
str函数是不是,传参数即可以是int 也可以是float,我想写个这样的函数,如何写?
pbsql 2004-09-23
  • 打赏
  • 举报
回复
SQL的参数类型都必须指定,没有不定类型参数
moshangchen 2004-09-23
  • 打赏
  • 举报
回复
就是写函数像SQL Server系统函数那样,传参数int 和varchar类型函数都可以接受,好像是函数重载的.不知是怎么实现的,是用外部函数来写的吗,谁知道给点提示.
moshangchen 2004-09-23
  • 打赏
  • 举报
回复
我不是要自己编写cast,我的意思是,如果我编写其他的函数 ,怎么才可以编成函数参数满足各种类型的函数。

27,580

社区成员

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

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