1. 首页 > 单招新闻 >

sqlserver函数大全及举例_sqlserver函数语法

sqlserver 有没有md5函数

enddate:可以理解减数。如果startdate大于enddate返回负值。

Sqlserver内置函数实现MD5

sqlserver函数大全及举例_sqlserver函数语法sqlserver函数大全及举例_sqlserver函数语法


sqlserver函数大全及举例_sqlserver函数语法


16位:

SELECT substring(sys.fn_sqlvarbasetostr(HashBytes('MD5'从(, '需要加密字符串')),3,16)

32位

SELECT substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','需要加密字符串')),3,32)

如何用sql语句创建函数如何用sql语句创建函数数据

SELECT YEAR('2021-02-09') --返回 2021

sql创建函数

-测试环境mssql2008

-Idea,用逗号将字符串拆分,然后转换成行和列。

-使用CLR

-1.建造一张桌子

创建表T

(pkqvarchar(200)

)-2.插入数据

插入到T值(井4,井0,井0,井0,井0,井0,,,,,,,,)

插入到T值(匡,井0,休,井0,井0,井0,井0,井8,井4,井0,井0,井0,井8,井4)

插入到T值(匡,井0,休,井0,井0,休,休,井0,井0,井休,井8,井4)

-3.创建一个字符串拆分函数(用C#创建一个CLR函数会更好)

创建函数f_split1(@sourceSQLVarchar(8000),@StrSeprateVarchar(2))

返回@tempTable(idIntIdentity(1,1),colVarchar(100))

如同

开始

将@ch声明为Varchar(100)

set@sourceSQL=@sourceSQL@strseprate

while(@sourceSQL)

开始

Set@ch=left(@SourceSql,Charindex(@StrSeprate,@SourceSql,1)-1)

插入@temp(col)值(@ch)

Set@SourceSql=Stuff(@SourceSql,1,Charindex(@StrSeprate,@SourceSql,1),)

结束

返回

结束

-3.调查

挑选

[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],

[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],

[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]

selectROW_NUMBER()over(orderbygetdate())ASRn,的

从T

)的外部应用dbo.f_split1(pkq,,)

在枢轴上转动

(值(列)

对于中的id

([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],

[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],

[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]

))P

-4.影响

SQL语句,数据库中,我要将字符串转换为数值应该用什么函数?

Int(number):转换为小于或等于接收参数的整数值,CInt(number):转换为表达式为Integer型的数值,CLng(number):转换为表达式为Long型的数值,Fix(number):去掉参数的小数部分并传回,cCur(number):转换为Currency子类型的数值以上请选择使用。

MicrosoftSQL如何创建,自定义函数?

CreateFunctionRmGetPY(@chnnchar(1))

returnschar(1)

begin

declare@nint

declare@cchar(1)

set@n=63

select@n=@n+1,@c=casechnwhen@chnthenchar(@n)else@cendfrom(

selecttop27from(

s'噢'unionallselecectchn=

'吖'unionallselect

'八'unionallselect

'嚓'unionallselect

'_'unionallselect

'_'unionallselect

'发'unionallselect

'旮'unionallselect

'铪'unionallselect

'丌'unionallselect

'丌'unionallselect

'咔'unionallselect

'垃'unionallselect

'呒'unionallselect

'_'unionallselect

'_'unionallselect

'七'unionallselect

'_'unionallselect

'仨'unionallselect

'他'unionallselect

'_'unionallselect

'_'unionallselect

'_'unionallselect

'夕'unionallselect

'丫'unionallselect

'_'unionallselect@chn)asa

orderbychnCOLLATEChinese_PRC_CI_AS

)a

return(@c)

end

go

CreateFunctionGetAllPY(@chnnvarchar(100))

returnsvarchar(30)

begin

declare@iint,@jint,@resultvarchar(100)

set@result=''

set@i=len(@chn)

set@j=1

while@j=@i

begin

set@result=@result+dbo.RmGetPY(substring(@chn,@j,1))

end

return@result

end

看看这两个,典型的取汉字拼音码的函数

SQL统计函数的使用方法?

1、在使用SQL查询数据时,有时希望对查询的结果集进行统计分析。例如,统计所有课程的单价总和、求出结果集所有记录的值或最小值、结果集中的记录数量等统计数据。这就需要用到SQL统计函数。SQL统计函数是在查询结果集的基础上对列数据进行各种统计运算,运算的结果形成一条汇总记录。下表给出了MySQL提供的统计函数及其功能。

2、上表中的ALL为统计函数的默认选项,指计算所有的值;使用DISTINCT关键字则去掉重复值;列表表达式是指含有列名的表达式。下面给出几个常用统计函数的例子。

例1:查询mooc数据库的course表,查询所有课程记录,并求出课程记录价格字段的总和。

求课程记录价格字段的总和可以使用SUM函数,SUM函数只能用于数值型字段,并且忽略列值为NULL的记录。在查询窗口输入下面的SQL语句。

SELECTname,SUM(pr)as总价FROMcourse

在上面的SQL语句中,使用SUM函数计算pr字段值的总和,并使用AS关键字将pr字段别名为“总价”。SQL查询结果如下图所示。

3、例2:查询mooc数据库的course表,查询所有课程记录,并求出课程记录价格字段的值和最小值。

求课程记录价格字段的值和最小值,可以使用MAX和MIN函数,MAX函数求出给定列值的值,MIN函数求出给定列值的最小值,MAX和MIN函数可用于数值型字段、字符串型字段、日期类型字段。在查询窗口输入下面的SQL语句。

SELECTMAX(pr)AS值,MIN(pr)AS最小值FROMcourse

在上面的SQL语句中,使用MAX函数求出所有课程记录pr字段的值,并使用AS关键字将pr字段别名为“值”;使用MIN函数求出所有课程记录pr字段的最小值,并使用AS关键字将pr字段别名为“最小值”。SQL查询结果如下图所示。

4、例3:查询mooc数据库的course表,查询类别为“机器学习”的课程记录,并求出课程数量。

求课程的数量可以使用COUNT函数,COUNT函数用于统计查询结果集中记录的个数,在COUNT函数中,“”用于统计所有记录的个数,ALL关键字用于统计指定列的列值非空记录个数,DISTINCT关键字用于统计指定列的列值非空且不重复的记录个数,默认值为ALL。在查询窗口输入下面的SQL语句。

在上面的SQL语句中,使用COUNT函数求出查询结果集的记录数,在COUNT函数中使用“”指明要统计所有记录个数。SQL查询结果如下图所示。

求课程单价的平均值,可以使用AVG函数,AVG函数用于计算给定列值的平均值,AVG函数只能用于数值型字段。在查询窗口输入下面的SQL语句。

SELECTAVG(pr)AS平均价格FROMcourse

在上面的SQL语句中,使用AVG函数求出课程记录pr字段的平均值,并使用AS关键字将pr字段别名为“平均价格”。SQL查询结果如下图所示。

sql怎么使用自定义函数来查询?

用游标:declare@变量1varchar(50),@变量2varchar(50)-----创建游标declaremycurscursorforselect字段A,字段Bfromtable1openmycurs-----打开游标fetchnextfrommycursinto@变量1,变量2while@@fetch_Status=0--循环游标begin---循环处理fetchnextfrommycursinto@变量1,变量2endclosemycursDeallocatemycurs我说的可能不好,你自己去可以看看游标的相关资料。

sql语句的几个常用函数总结?

聚合函数max()count()sum()min()开窗函数row_number(),rank()时间函数convert(),adatediff(week,,getdate())

sqlserver中自定义函数

用函数datepart处理就可以了,示例:

创建自定义函数:

use 数据库名

go

(@pno int)

returns int

begin

declare @a int

if not exists(select from person where pno=@pno)

else

seset @a=-1t @a=1

return @a

end

调用函数:

use 数据库名

go

select dbo.函数名(13)

oracle中功能等同sqlserver中的datediff的函数?

是天数的计算,

SQL中:

select

datediff(day,'2006-05-26

10:11','2006-05-25

11:11')

结果为1天,只判断日期中的天数,是不根据时间来判断的。但是转到ORACLE:

select

trunc((to_date('2006-05-26

10:11','YYYY-MM-DD

HH:MI')

-to_date('2006-05-25

11:11','YYYY-MM-DD

HH:MI')))

datediff

from

结果为0,只有把前面一个日期改成'2006-05-26

11:11'之后的时间才返回1天。

我要求是只根据天数来求值,看来要统一把比较的日期改到最小单位为天的日期,实际使用中是要把sysdate与结果集中字段计算的,该字段compdate是YYYY-MM-DD

HH:MI格式的varchar2类型,难道要我这么写:

select

trunc(to_date(to_char(sysdate,'YYYYMMDD'),'YYYYMMDD')

-to_date(to_char(to_date(compdate,'YYYY-MM-DD

HH:MI'),'YYYYMMDD'),'YYYYMMDD'))

from

table1

感觉太烦了,有更好的办法吗?

-----------------------------

解决方法:

select

trunc(sysdate)

-trunc(to_d5、例4:查询mooc数据库的course表,查询所有课程记录,并求出课程单价的平均值。ate('2006-05-28

10:20','YYYY-MM-DD

HH24:MI'))

from

select

from

温度表

Awhere

时间

between

'"

+Str(dtStart.Value)

+"'AND

'"

+Str(dtEnd.Value)

And

Not

Exists

(Select

时间

From

温度表

Where

DateDiff(mi,

A.时间)

<=

"+

Str(text1.text)

+")

order

有,而且这类函数的功能相当丰富,依照我们人的习惯应设置为周一为一周的开始,那么函数就为:by

id

try

select

from

温度表

Awhere

时间

between

'"

+Str(dtStart.Value)

+"'AND

'"

+Str(dtEnd.Value)

And

Not

Exists

(Select

时间

From

温度表

Where

DateDiff(mi,

A.时间)

<=5

)order

by

id

SQL SERVER查询时间是一年中第几周的函数

create function 函数名

SQL SERVER查询时间是一年中第几周的函数?1、获取当前系统数据库的日期和时间,可以利用函数GETDATE(),select GETDATE()。

object o= cmd.ExecuteScalar();

2、获取当前世界标准时间的日期时间值,利用GETUTCDATE()函数,select GETUTCDATE()。

3、获取某个日期时间中的日期,可以利用DAY()函数,select DAY(日期)。

4、获取日期中的月份,利用MONTH()函数,select MONTH(日期)。

5、获取日期中的年份,利用YEAR()函数,select YEAR(日期)。

6、获取日期中指定部分字符串值的,可以利用函数DATENAME()函数。

如何计算是第几周

这个只能循环判断吧。 首先先判断一下这个周是否有26号。如果有,就判断26号是周几,不管结果如何,加周标识,或者本周的起始日期,然后再循环判断下周。

sql server关于判断日期为当月第几周星期几问题

星期几问题:DatePart, DateName 都可以满足你的要求了 当月第几周:简单点,用 DatePart,这个可能跟系统区域语言设置有关(国外都是周日是天,周一是天),具体想更好,就自己看着办啦。 举个例:求 2013/11/07是11月第几周 SELECT DATEPART(WEEK, '2013/11/07') - DATEPART(WEEK, '2013/11/01') + 1 即,求出 11月7 号是一年中第几周,减去 11月1 号是一年中第几周的值,因从 1 开始计数,所以加个 1

1、获取当前系统数据库的日期和时间,可以利用函数GETDATE(),select GETDATE()。

2、获取当前世界标准时间的日期时间值,利用GETUTCDATE()函数,select GETUTCDATE()。

3、获取某个日期时间中的日期,可以利用DAY()函数,select DAY(日期)。

4、获取日期中的月份,利用MONTH()函数,select MONTH(日期)。

5、获取日期中的年份,利用YEAR()函数,select YEAR(日期)。

6、获取日期中指定部分字符串值的,可以利用函数DATENAME()函数。

1、DATEADD(datepart,number,date)

作用:返回给指定日期加一个时间间隔后新的datetime值

参数说明:

datepart:指定为日期的哪部分增加数值。

常用的值有:年(yy/yyyy),季度(qq/q),月份(mm/m),日(day/dd/d),周(wk/ww),小时(hh),分钟(mi,n),秒(ss/s)。

number:指定要增加的数值。如果是非整数将会舍去小数部分。负数表示减去相应的时间间隔。

date:表示要处理的日期。

用法:

-- 在指定日期上加三个月

select DATEADD(mm,3,'2020-12-30');

-- 指定日期减一天

select DATEADD(day,-1,'2020-12-30');

2、DATEDIFF(datepart,startdate,enddate)

作用:指定两个时间相的时间数。比如天、小时、分钟等等。

参数说明:

datepart:指定返回的日期时间维度(天、小时、分钟)。

常用的值有:年(yy/yyyy),季度(qq/q),月份(mm/m),日(day/dd/d),周(wk/ww),小时(hh),分钟(mi,n),秒(ss/s)。

startdate:可以理解被减数。

用法:

SELECT DATEDIFF(day,'2021-02-05','2021-02-09') AS DiffDate --返回 4天

3、DATENAME(deatpart,date)

作用:返回指定日期的指定部分的字符串。

参数说明:

datepart:指定返回的日期时间维度(天、小时、分钟)。

常用的值有:年(yy/yyyy),季度(qq/q),月份(mm/m),日(day/dd/d),周(wk/ww),小时(hh),分钟(mi,n),秒(ss/s)。

date:日期表达式

用法:

DateName(quarter,GetDate()) as '第几季度'

DateName(week,GetDate()) as '一年中的第几周'

DateName(DAYOFYEAR,GetDate()) as '一年中的第几天'

DateName(year,GetDate()) as '年'

DateName(day,GetDate()) as '日'

DateName(hour,GetDate()) as '时'

DateName(minute,GetDate()) as '分'

4、DATEPART(deatpart,date)

返回指定日期中指定部分的整数。用法和DATENAME相似,返回值为整数。比如:

SELECT DATEPART(weekday,'20210209') --返回值为2

5、DAY|MONTH|YEAR 函数

作用:返回指定日期所在 日/月/年的部分。可以用DATEPART替换。

用法:

SELECT DAY('2021-02-09') --返回 9

SELECT MONTH('2021-02-09') --返回 2

6、EOMONTH(input[,month_to_add])

作用:该函数是在SQL 2012中引入的。EOMONTH函数用来返回指定日期之前或之后某个月的一天的日期。

语法结构:=EOMONTH(开始日期,指定起始日期前后的月份)

用法;

DECLARE @date DATETIME = '2021-02-09';

SELECT EOMONTH ( @date,7) AS Result; --加七个月的月末日期 2021-09-30

SELECT EOMONTH ( @date,-2) AS Result; -- 减两个月的月末日期 2020-12-31

7、FROMPARTS

作用:根据输入的年、月、日参数生成一个日期值,并返回。

要计算特定日期是本年度的第几周。

有人认为每周日是每周的天,还有人习惯认为每周一是每周的天,不管是那种认定方式,都可以用WEEKNUM来解决这个问题,只不过参数不同而已。

WEEKNUM函数基础

功能:

返回特定日期的周数。

语法:

WEEKNUM(serial_number,[return_type])

参数:

Serial_number:必需。代表一周中的日期。 应使用 DATE函数输入日期,或者将日期作为其他公式或函数的结果输入。例如,使用函数 DATE(2008,5,23)输入 2008 年 5 月 23 日。如果日期以文本形式输入,则会出现问题。

Return_type:可选。一数字,确定星期从哪一天开始。 默认值为 1。不同数字与每周以哪一天开始对应如下表:

Return_type 一周的天为 1 或省略 星期日 2 星期一 11 星期一 12 星期二 13 星期三 14 星期四 15 星期五 16 星期六 17 星期日

undefined

举例:

日期 2018/6/10 (2018/6/10为周日) 公式 结果 说明 =WEEKNUM(B1) 24 2018/6/10 在2018年中的周数,一周开始于星期日(默认值) =WEEKNUM(B1,2) 23 2018/6/10 在2018年中的周数,一周开始于星期一(第二个参数 2)

本例解析

本示例中,周日为每周天的公式为:

=WEEKNUM(A3)

本示例中,周一为每周天的公式为:

=WEEKNUM(A3,2)

、DATEADD(datepart,number,date)

作用:返回给指定日期加一个时间间隔后新的datetime值

参数说明:

datepart:指定为日期的哪部分增加数值。

常用的值有:年(yy/yyyy),季度(qq/q),月份(mm/m),日(day/dd/d),周(wk/ww),小时(hh),分钟(mi,n),秒(ss/s)。

number:指定要增加的数值。如果是非整数将会舍去小数部分。负数表示减去相应的时间间隔。

date:表示要处理的日期。

用法:

-- 在指定日期上加三个月

select DATEADD(mm,3,'2020-12-30');

-- 指定日期减一天

select DATEADD(day,-1,'2020-12-30');

2、DATEDIFF(datepart,startdate,enddate)

作用:指定两个时间相的时间数。比如天、小时、分钟等等。

参数说明:

datepart:指定返回的日期时间维度(天、小时、分钟)。

常用的值有:年(yy/yyyy),季度(qq/q),月份(mm/m),日(day/dd/d),周(wk/ww),小时(hh),分钟(mi,n),秒(ss/s)。

startdate:可以理解被减数。

用法:

SELECT DATEDIFF(day,'2021-02-05','2021-02-09') AS DiffDate --返回 4天

3、DATENAME(deatpart,date)

作用:返回指定日期的指定部分的字符串。

参数说明:

datepart:指定返回的日期时间维度(天、小时、分钟)。

常用的值有:年(yy/yyyy),季度(qq/q),月份(mm/m),日(day/dd/d),周(wk/ww),小时(hh),分钟(mi,n),秒(ss/s)。

date:日期表达式

用法:

DateName(quarter,GetDate()) as '第几季度'

DateName(week,GetDate()) as '一年中的第几周'

DateName(DAYOFYEAR,GetDate()) as '一年中的第几天'

DateName(year,GetDate()) as '年'

DateName(day,GetDate()) as '日'

DateName(hour,GetDate()) as '时'

DateName(minute,GetDate()) as '分'

4、DATEPART(deatpart,date)

返回指定日期中指定部分的整数。用法和DATENAME相似,返回值为整数。比如:

SELECT DATEPART(weekday,'20210209') --返回值为2

5、DAY|MONTH|YEAR 函数

作用:返回指定日期所在 日/月/年的部分。可以用DATEPART替换。

用法:

SELECT DAY('2021-02-09') --返回 9

SELECT MONTH('2021-02-09') --返回 2

6、EOMONTH(input[,month_to_add])

作用:该函数是在SQL 2012中引入的。EOMONTH函数用来返回指定日期之前或之后某个月的一天的日期。

语法结构:=EOMONTH(开始日期,指定起始日期前后的月份)

from a,b,c,d 也可以用另外用Join on 的方式,可以结构上简单粗暴,两种想增加任意多表级联都先往表区域里丢个表名,级联条件丢在where或join区域里即可,你细品,当然写Join 列表也不是什么难事。主“事实表”写一个,其他都Left join,维度表不一定比事实表小,没索引的基本可以在联接关系中忽略……如果看懂了自己总结一下,说多了你记不住,等于没说。

特别适合生成动态拼接的SQL语句,无穷扩展,我设计了两个界面,步产生宽表,除了“聚”,外列选择,列过滤,筛选都在步产生,表的级联是可以无穷递归在关系里嵌套深挖,但都简单罗列,把复杂变简单,这非常非常重要。可以生成Where或Join类型的SQL任选,用户无需自己写SQL,全程鼠标戳戳即可,当然输入条件还是得用键盘的,但原则上尽量用鼠标,回头弄好了我把截图发上来。

第二个界面就是聚合,和PowerBI界面上的作一样。

可以搞定关系型数据库所有的常规报表,准不准客户知道,我都不用关心里边具体的逻辑,他们自己就知道调整,我只是负责创造这种调整的可能性。

这样用户就可以每天做宽表,做聚合,做宽表,做聚合,吃饭睡觉打豆豆。。。。。

我还做了一个SQL语句的AST解析成XMl的工具,理论上可以批量自动阅读替换SQL,还没想好具体应用上怎么玩,但直觉上这东西加点智能,将来可以代替千军万马人类的劳动,SomeDay Maybe。

对付一个系统,上千个表,几百个SP,FN,View,先用工具扫描记录一下所有表结构,高频依赖对象,建立一个Relation表,这样就梳理出了核心级联关系,用机器和神经去做,别用脑细胞。比如什么收费退费都是有雷同模式的,举一反五。

早起用Pad戳的文字,这几天黑白颠倒,神魂颠倒,兴奋又无力,先对付看吧。

@nonesuccess 回应评论里的问题,写这里大家可能都有用:目前多数业务系统都是用字符串类型的字段做关联,这样恰好方便我们扫描关系,判断一列随机取样100个不同的,是否命中另外一个表的某字段,这样的语句你会写吧?好,这就是关键!~用程序根据行数,索引类型选出可能的事实表,和维度表,互相做个全部字段的探测。

设数据库有100个表,每个10个可能发生联系的字符串类型字段,一秒探测一次的话,要做10001000次,百万级别的探测,把这些字段的关系,记录在一个Relation表里,当然,就算计算机玩命跑你也等不起百万秒那一天才8万多秒,你不可能等上10天,这种探测也是有办法缩小规模的。那就需要一些经验技巧,如果系统是别人开发的,肯定会留下蛛丝马迹,在同一个存储过程、 FN,View等中一起使用的表,就肯定上下文有联系,MSSQL有SP_Dependens这种内建存储过程,可以得到对象之间的关系线索,如果你的数据库没有这种内建机制,你可以列出所有的Create代码,简单文本处理一下就知道里边有哪些表了。

那么花一下午时间让程序跑完所有数据库表的嫌疑关系,我们就得到了这种东西:

这种东西以前我还希望人能清晰的看出来和边,做了一些基于力学原理的可视化图布局优化,现在看,没必要,因为这种关系已经超过人类的视觉理解了,只要计算机自己清楚就行了,没必要显示的好看,事实上因为边太多,不可能清晰好看,必然像蜘蛛网一样。

然后,还有十万字要写,我概括一下:

1,做个无限Visit关系的树,可以根据关系级联展开表,对表的字段进行选择,过滤,排序,聚合,聚合选择,聚合排序,聚合过滤等一堆勾选,就可以生成SQL了,测试预览执行进数仓。这才是真正的随心所欲ETL抽取,半技术的业务人员用鼠标即可作,全程不需要写SQL。ETL工具如果不能给非技术人员用,那也就是个运维工具,没有核心价值

SQL SERVER:

select datepart(weekday,getdate()) as 周内的第几日

select datepart(week,getdate()) as 年内的第几周

select datepart(quarter,getdate()) as 年内的第几季

周内的第几日

-----------

5(所影响的行数为 1 行)

年内的第几周

-----------

34

(所影响的行数为 1 行)

年内的第几季

-----------

3(所影响的行数为 1 行)

select datepart(参数,datetime)

示例: select datepart(week,getdate()) 判断今天为本年第几周

参数部分如下:

year 将返回日期的年份

quarter 将返回日期在年内的第几季

month 将返回日期的月份

dayofyear 将返回日期在年内的第几天

day 将返回日期在该月的第几天

week 将返回日期在年内的第几周

weekday 将返回日期在周内的第几日

Hour 将返回日期的小时部分

minute 将返回日期的分钟部分

second 将返回日期的秒钟部分

SET DATEFIRST 1

GO

SELECT DATEPART(WW,GETDATE())

查询出来的结果就为这一年的第几周

oracle 中GREATEST 在sqlserver有何函数对应

+在sqlserverset@j=@j+1表示合并字符串

意思就是right('002013',2) = '13'

oracle里这么写 , |--D = 默认值或 DEFAULT 约束|表示合并,代替+

substring('002013',-2) 这样跟right一个意思

另外convert函数用to_char代替,用法都不一样

sqlserver里有没有类似indexOf功能的函数

时间,

SQL CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下:

CHARINDEX ( expression1 , expression2 [ , start_location ] )

Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。

SQL CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。如SQL CHARINDEX函数没有找到要找的字符串,那么函数整数“0”。看下面的函数命令执行的结果:

CHARINDEX('SQL', 'Microsoft SQL ')这个函数命令将返回在“Microsoft SQL ”中“SQL”的起始位置,在这个例子中,CHARINDEX函数将返回“S”在“Microsoft SQL ”中的位置11。

接下来,看这个CDateName(month,GetDate()) as '月'HARINDEX命令:

CHARINDEX('7.0', 'Microsoft SQL 2000')在这个例子中,CHARINDEX返回零,因为字符串“7.0” 不能在“Microsoft SQL ”中被找到。

C#怎么调用sqlserver的自定义函数

BEGIN

这里我们用C#做一个计算滑轮系统近似距离的函数,并把该函数部署到Sql2005上去,这里使用的方法是原始的,全手动方式的部署方式,主要的目的是为了理解部署原理,实际上直接开Sql数据库项目可能更容易些。

首先让我们看一下滑轮传输带系统图示,如下图所示:

用C#编写SQL自定义函数

一、首先在VS2005里编写一个计算传输带距离的函数,源代码如下所示:

//自定义计算传输带距离的函数

using System;

using System.Collections.Generic;

using System.Text;

namespace SqlClr

{public class pulley

{public static double PulleyDistance(double Pulley1Diameter, double Pulley2Diameter, double BeltLength)

{double length = 0, a = 2.0;

double b = BeltLength - 1.57 (Pulley1Diameter + Pulley2Diameter);

double c = System.Math.Pow(Pulley1Diameter - Pulley2Diameter, 2.0);

double b1 = (b b) - (4 a c);

if (b1 > 0)

{length = (b + Math.Sqrt(b1)) / (2 a);

//检查传输带是否合适

if (length < ((Pulley1Diameter + Pulley2Diameter) / 2))

{//返回0,如果传输带不合适;

length = 0;

}}

//精度只允许一位小数

}}

}把以上CS文件编译为动态连接库, 在Visual Studio 2005 命令行模式下使用命令:

csc /t:library /out:pulleylib.dll pulley.cs

编译成功,得到了一个pulleylib.dll

--编译PulleyDistance函数

Drop Assembly Mechanics --如果编译程序出错可以用此命令删除程序集

from 'E:\pulleyLib.dll'

Go

Create function PulleyDistance

(@diameter1 float,

@diameter2 float,

@beltLength float

)--注意这里的三个参数名称可以和CS编写的静态函数不同,但类型要兼容一致

returns float

As External name

--CS中定义的静态函数全称一般为【命名空间.类名】.【函数名】,注意这里是区分大小写的,对应 [SqlClr.pulley].[PulleyDistance]

GO

--检查是否已经部署上了

select dbo.PulleyDistance(3,2,100)

--检查部署结果

select routine_name,routine_body from rmation_schema.routines

通过以上两步,一个.NetCLR的函数就部署到了Sql上了

sql.exec("insert into pig(pigID) values(dbo.AutoNum('HQ-'))");

直接写,或者写储存过程,在储存过程里面调用函数。

//定义

SqlConnection conn = new SqislConnection(DbTool.getSQLConnString());

string strSql = "AutoNum"; //" and user_role='Administrator'";

SqlCommand cmd = new SqlCommand(strSql, conn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@cust_name",SqlDbType.NVarChar).Value="";

cmd.Parameters.Add("@returnString", SqlDbType.NVarChar);

cmd.Parameters["@returnString"].Direction = ParameterDirection.ReturnValue;

string strRTN = "";

//方法

try

{conn.Open();

strRTN = cmd.Parameters["@returnString"].Value.ToString();

}catch (Exception ex)

{LabelTestMSG.Text = ex.Message;

}finally

{if (!(conn.State == ConnectionState.Closed))

{conn.Close();

}}

}--------------

其实有个更简单的方法,你把函数封装到存储过程里,用exec的语句直接跟select语句一样的调用.

谁能帮忙解释下:VC下查询 MSSQL 数据库状态 的各类API函数及结构体的参数!

exception

C++ 的中文参考很少的,这些中文的解释估计就没有

二、在SQL Sr 2005中部署CS的自定义函数

windows核心编程中有说明

OpenSCMarA 这样后面跟个A的为ANSI 版本 接受ANSI 字符串

QueryServStatusEx 后面无A或W的则根据编译环境 选择A版或W版本。

各注释 英文的你自己也不多能明白

LP开头的为指针等你也都很明白了

SQL SERVER 中存储过程和函数的区别

那象你那样这样写不就行吗

Sql Sdualerver 数据库中的存储过程:

解析SQL存储过程:

存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,类似一门程序设计语言,也包括了数据类型、流程控制、输入和输出和它自己的函数库。存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个 功能的时候调用他就行了。不过SQL存储过程对于一些初学者来说还是比较抽象难理解的,因此本文将由浅至深地剖析SQL存储过程,帮助你学习它。

存储过程的优点:

存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度,效率要比T-SQL语句高。

当对数据库进行复杂作时,可将此复杂作用存储过程封装起来与数据库提供的事务处理结合一起使用。

存储过程可以重复使用,可减少数据库开发人员的工作量。

安全性高,可设定只有某些用户才具有对指定存储过程的使用权

存储过程的缺点:

存储过程将给server带来额外的压力。

存储过程多多时维护比较困难。

移植性。在升级到不同的数据库时比较困难。

调试麻烦。SQL语言的处理功能简单。

Sql 数据库中的自定义函数:

“自定义函数”是我们平常的说法,而“用户定义的函数”是 SQL 中书面的说法。

自定义函数分为:标量值函数或表值函数

如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数。

如果 RETURNS 子句指定 TABLE,则函数为表值函数。

表值函数又可分为:内嵌表值函数(行内函数)或多语句函数

如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为内嵌表值函数。

如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。

自定义函数优点:

可以在SQL语句中调用,直接使用返回值,从而可以形成复杂的SQL应用。

自定义函数缺点:

能在函数中使用的语句有严格限制:

不支持create、ALTER、drop等DDL(Data Definition Language)命令;

insert、delete、update只能用在临时表上;

不支持动态SQL;

不支持“不确定”的函数,比如常用的getdate。不确定函数是指输入参数相同,返回结果可能不同的函数。

变通办法:

要解决用户函数的种种限制,可以巧妙运用用户函数调用存储过程。比如,需要在函数中用getdate,就写个存储过程返回getdate的结果。然后从函数里去调用这个存储过程。需要在函数中使用update等,也可类推。

白雨青工作站发文地址:

sqlserver中如何在用户定义的函数里使用exec?

SELECT DateName(weekday,'20210209') --返回值为星期二

这里我举个例子,如有一个函数dbo.NumAdd用来计算加法,那它可能是这样的:

DROP FUNCTION dbo.NumAdd

G[Mechanics].[SqlClr.pulley].[PulleyDistance]O

CREATE FUNCTION dbo.NumAdd

( @A SMALLINT,

@B SMALLINT

)RETURNS INT

AS

DECLARE @Ret INT

SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)

RETURN @Ret

END

你可以使用这样的方式调用函数并得到返回值:

DECLARE @M INT

SET @M = dbo.NumAdd(500,700)

select @M

现在,把这个函数修改成种使用存储过程的方式:

DROP Procedure dbo.NumAdd1

GO

CREATE Procedure dbo.NumAdd1

( @A SMALLINT,

@B SMALLINT,

@Ret INT OUTPUT

)AS

SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)

END

GO

那么,你就可以通过下列的方法调用这个实际和函数dbo.NumAdd功能相同的存储过程:

DECLARE @M1 INT

EXEC dbo.NumAdd1 500,600,@M1 OUTPUT

SELECT @M1

这种方法是对标量函数较好的处理方法,而且,一个存储过程可以使用一个或者多个带有OUTPUT的参数来返回值。

再看第二种方法修改为存储过程的方式:

DROP Procedure dbo.NumAdd2

GO

CREATE Procedure dbo.NumAdd2

( @A SMALLINT,

@B SMALLINT

)AS

DECLARE @Ret INT

SET @Ret = ISNULL(@A,0) + ISNULL(@B,0)

SELECT @Ret

END

GO

这样,你就可以使用下面的方法来调用:

DECLARE @M2 INT

CREATE TABLE #Temp (Result INT)

INSERT #Temp EXEC dbo.NumAdd2 800,600

SELECT TOP 1 @M2 = Result FROM #Temp

DROP TABLE #Temp

SELECT @M2

列出的这两种方法都是把函数改成存储过程的方法,而且在存储过程中可以使用EXEC、PRINT等函数中不能使用的内容。

这个解释你明白了吗?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, b19126499425@163.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息