随笔分类 -  User-Defined Functions

摘要:MS SQL Server一个自定义函数[dbo].[udf_ConvertSecondToTime],把秒数转换为时间。传入的值最大为86399,如果大于这个数值,这将会出现异常:The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.udf_ConvertSecondToTime SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--============================================= 阅读全文
posted @ 2012-03-24 22:40 Insus.NET 阅读(569) 评论(0) 推荐(1) 编辑
摘要:T-SQL自定义函数,它有点像MS SQL Server的REPLICATE函数。它有三个参数,第一个@String是原有字符串,第二@Char参数就将要加入至前置字符串,第三个@Leng参数为前置字符串重复次数。udf_LeftPad SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--=============================================--Author:Insus.NET--Createdate: 2012-03-24--Description:CharactertoprependontoString--======= 阅读全文
posted @ 2012-03-24 12:54 Insus.NET 阅读(552) 评论(0) 推荐(1) 编辑
摘要:Insus.NET在前段时间,曾分享过一篇文章的上一篇和下一篇导航是使用了用户控件实现,并拉入文章显示的页面。这样子,显示文章最基本需要去读取三次数据库获取数据,一次是获取文章信息,另两次是在用户控件被使用,是获取前一篇和下一篇的标题和ID。为了改善这个性能的问题,故产生此篇:去除用户控件,直接在读取文章时,把上一篇的ID与标题与下一篇的ID与标题一起获取。这样一次获取,节能60%。可以参考获取文章的存储过程:usp_Article_GetByPrimaryKey SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--====================== 阅读全文
posted @ 2012-03-23 23:54 Insus.NET 阅读(819) 评论(3) 推荐(1) 编辑
摘要:下面两个自定义函数,一个是获取指定的前一天的日期,另外一个是获取指定日期的后一天日期。开发企业内网软件常用,为了更好的的规范和代码维护,Insus.NET常会把一些重复使用的代码,重构为函数。返回前一天:udf_Yesterday --=============================================--Author:Insus.NET--Createdate: 2012-03-22--Description:指定日期,返回前一天日期--=============================================CREATEFUNCTION[dbo].[u 阅读全文
posted @ 2012-03-22 11:06 Insus.NET 阅读(822) 评论(0) 推荐(1) 编辑
摘要:判断指定一个日期,是否为今天。 本自定义函数,返回BIT数据类型,如果返回1,说明指定的日期为今天日期,否则不是。自定义函数中,使用了另外一个T-SQL日期比较的函数[dbo].[DateTimeCompare](date1,date2),此函数详细可参考http://www.cnblogs.com/insus/archive/2011/06/24/2089005.htmludf_IsToday --=============================================--Author:Insus.NET--Createdate: 2012-03-22--Descripti 阅读全文
posted @ 2012-03-22 10:38 Insus.NET 阅读(1312) 评论(0) 推荐(1) 编辑
摘要:比如一串字符以某定义符号分隔,现我们需要以定义符号对这串字符进行拆分。可以使用XQuery的nodes()方法来实现。实现可参考到这篇:http://www.cnblogs.com/insus/archive/2012/02/25/2367743.html。不过Insus.NET把实现的方法写成一个自定义函数,在需要的地方调用即可。udf_StringSplit SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--=============================================--Author:Insus.NET--Createdat 阅读全文
posted @ 2012-02-26 00:15 Insus.NET 阅读(1368) 评论(0) 推荐(1) 编辑
摘要:Sample如:‘insus’ --> 's','u','s','n','i'转换字符串的字符成单个字符并用逗号分隔,这样可以在动态SQL中供SELECT动态调用至WHERE IN条件内。ConvertINString CREATEFUNCTION[dbo].[ConvertINString](@StringNVARCHAR(MAX))RETURNSNVARCHAR(MAX)ASBEGINDECLARE@ResultNVARCHAR(MAX)=N''DECLARE@IINT=LEN(@Stri 阅读全文
posted @ 2012-02-23 00:48 Insus.NET 阅读(691) 评论(0) 推荐(1) 编辑
摘要:计算某当天的时间从0点0秒开始,某一时间点过了几秒。可以根据用户输入的时间,计算出午夜时间,然后使用DATEDIFF函数可以算出过几秒。如果获得午夜时间,可以参考:http://www.cnblogs.com/insus/archive/2011/09/09/2172419.html ,Insus.NET在此使用DATE(新版的SQL新增的日期类型,如SQL 2008 R2)完整函数:DurationSeconds CREATEFUNCTION[dbo].[DurationSeconds](@DateDATETIME)RETURNSINTASBEGINDECLARE@MidnightDATET 阅读全文
posted @ 2012-02-22 09:05 Insus.NET 阅读(547) 评论(0) 推荐(1) 编辑
摘要:MS SQL没有一个如vb一样的Cstr的函数。平常在T-SQL开发过程中,却很想要这样的一个功能,把一个输入的值转换为string, 如果用户输入一个NULL值,却把它转为一个N''值。因此也写了一个自定义函数:Cstr CREATEFUNCTION[dbo].[Cstr](@ValueSQL_VARIANT)RETURNSNVARCHAR(MAX)ASBEGINRETURNISNULL(CAST(@ValueASNVARCHAR(MAX)),'')END 阅读全文
posted @ 2012-02-20 00:25 Insus.NET 阅读(942) 评论(0) 推荐(1) 编辑
摘要:在维护一个网站,原开发者存储日期时,都是使用int数据类型,如20120218等。现Insus.NET获取这个字段做其它处理,得先需要把它们转为DateTime数据类型。因此产生以下这个User-Defined Functions(自定义函数):udf_ConvertIntDatetimeCREAT... 阅读全文
posted @ 2012-02-18 16:42 Insus.NET 阅读(7278) 评论(0) 推荐(1) 编辑
摘要:今天分享密码策略的重试次数与登录失败锁定持续的小功能。软件中,需要一个管理介面,可让系统管理设置相关的参数,这些设置将保存于数据库中,这两个参数初始化为0,如果大于0,说明管理员已经启用此功能。如下:从功能上看,只是涉及至验证用户与登录时需要实现在功能,Insus.NET不想改动太多地方,特别是程序部分,因此Insus.NET只是修改用户登录验证的一个存储过程:逻辑太约分几步,首先是密码参数表获取上图中两个参数:View Code DECLARE@NumberOfRetriesTINYINT=[dbo].[udf_GetPasswordParameterValue](1)DECLARE@Loc 阅读全文
posted @ 2012-02-08 09:21 Insus.NET 阅读(1385) 评论(0) 推荐(1) 编辑
摘要:需要为程序加一些功能,如下表,这些设置可让管理员根据自己实际情况设置,缺省值为0不作任限制。由于不是全新开发,而是在现在有程序补充功能,Insus.NET不想在程序作过多更改,只好修改存储过程来实现它们。现下面把实现上图highlight的选项功能分享出来。保持密码原有记录值,只要管理员设置了密码策略之后,用户更改自己的密码时,就会应用到了新密码策略。首先写一个获取参数值的自定义函数:udf_GetPasswordParameterValue SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--================================= 阅读全文
posted @ 2012-02-06 10:22 Insus.NET 阅读(715) 评论(0) 推荐(1) 编辑
摘要:你想获取某一年份第一周开始的日期,Insus.NET给你的答案,可以参考使用下面这个函数:http://www.cnblogs.com/insus/articles/1622988.htmlSELECT[StartDate]FROM[dbo].[udf_Week](2012,2012)WHERE[Week]=1上面SQL语句执行结果:但你还是觉得此方法很复杂,而且只需要日期部分,时间部分无需显示。因此Insus.NET更改并产生如下一个新函数,你把函数附加入你的数据库中,即可在程序中应用它了。udf_StartDateOfFirstWeek SETANSI_NULLSONGOSETQUOTED 阅读全文
posted @ 2012-01-26 16:51 Insus.NET 阅读(474) 评论(0) 推荐(1) 编辑
摘要:从SQL Server的视图INFORMATION_SCHEMA 中用INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 和INFORMATION_SCHEMA.TABLE_CONSTRAINTS两个视图INNER JOIN在一起,可以列出需要的数据,下面Insus.NET把它写成一个自定义函数:udf_KeyColumns CREATEFUNCTION[dbo].[udf_KeyColumns]()RETURNSTABLEASRETURN(SELECTkcu.[TABLE_NAME],kcu.[COLUMN_NAME],kcu.[ORDINAL_POSITI 阅读全文
posted @ 2012-01-19 16:59 Insus.NET 阅读(417) 评论(0) 推荐(1) 编辑
摘要:两个自定义函数,一个是返回一个Table,另一个是直接返回名称。udf_WeekDayName CREATEFUNCTION[dbo].[udf_WeekDayName]()RETURNS@WeekDayNameTABLE([Id]INT,[WeekDayName]NVARCHAR(15))ASBEGININSERTINTO@WeekDayName([Id],[WeekDayName])VALUES(0,'Saturday'),(1,'Sunday'),(2,'Monday'),(3,'Tuesday'),(4,'Wedn 阅读全文
posted @ 2012-01-03 09:33 Insus.NET 阅读(454) 评论(0) 推荐(2) 编辑
摘要:获取指定日期月份的第一天,你可以使用DATEADD函数,减去指定日期的月份过去了的天数,即可。udf_FirstDayOfMonthCREATEFUNCTION[dbo].[udf_FirstDayOfMonth](@DateDATE)RETURNSDATETIMEASBEGINRETURNCAST(DATEADD(day,1-DAY(@Date),@Date)ASDATETIME)END或者,用DATEDIFF计算指定日期与日期开始之时,相隔几个月,然后再DATEADD加上这个相隔月份数,从零开始。udf_FirstDayOfMonthCREATEFUNCTION[dbo].[udf_Fir 阅读全文
posted @ 2011-09-11 12:55 Insus.NET 阅读(2149) 评论(0) 推荐(1) 编辑
摘要:今天查看以前专案的数据库自定义函数,温习温习。发现其中有一个函数,是获取月份的天数的自定义函数。如下:udf_DaysInMonthCREATEFUNCTION[dbo].[udf_DaysInMonth](@DateDATETIME)RETURNSINTASBEGINDECLARE@dimASTABLE(MINT,DyINT)INSERTINTO@dimVALUES(1,31),(3,31),(5,31),(7,31),(8,31),(10,31),(12,31),(4,30),(6,30),(9,30),(11,30),(2,CASEWHEN(YEAR(@Date)%4=0ANDYEAR( 阅读全文
posted @ 2011-09-10 10:27 Insus.NET 阅读(1093) 评论(0) 推荐(1) 编辑
摘要:MS SQLServer,如何获取当前系统日期的午夜的时间值:下面是Infor syteline 8.02的自定议函数:MidnightOfALTERFUNCTION[dbo].[MidnightOf](@DateDATETIME)RETURNSDATETIMEASBEGINRETURN(dateadd(year,(datepart(year,@Date)-2000),dateadd(month,(datepart(month,@Date)-1),dateadd(day,(datepart(day,@Date)-1),'2000'))))END下面是此本书http://imag 阅读全文
posted @ 2011-09-09 13:11 Insus.NET 阅读(924) 评论(0) 推荐(2) 编辑
摘要:生产系统分早晚班问题,经约定,每天七点之前,所有生产记录,算前一天处理。因为系统记录产生的日期,是获取当前日期,需要改写一下,七点之前的取到的当天日期需要减去1天。解决方法可以多种,前台程序处理,或是可以数据库中处理。程序处理:GetGenerateDate stringGetGenerateDate(){DateTimedateTime1=DateTime.Now;DateTimedateTime2=Convert.ToDateTime(dateTime1.ToString("yyyy-MM-dd")+""+"07:00:00"); 阅读全文
posted @ 2011-08-29 10:47 Insus.NET 阅读(386) 评论(0) 推荐(1) 编辑
摘要:今天在论坛上看到一个问题,如下:解决这个问题,Insus.NET写了一个函数,可以方便以后的扩展,如果数值出现TB或是或更高时,可以只改这个函数即可。udf_OrderLimitSizeSETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOALTERFUNCTION[dbo].[udf_OrderLimitSize](@OvNVARCHAR(30))RETURNSdecimal(18,6)ASBEGIN--如果长度少于等于2的数值为返回NULLIF(LEN(@Ov)<=2)RETURNNULL--宣告两个变量DECLARE@vDECIMAL(18,6),@nD 阅读全文
posted @ 2011-08-21 16:40 Insus.NET 阅读(476) 评论(0) 推荐(1) 编辑