Server创造客户函数与使用,把int类型日期转变为
分类:数据库

MS SQL Server未有split(卡塔尔(英语:State of Qatar)函数,可是我们得以写贰个Table-valued Functions定义函数[dbo].[udf_SplitStringToTable] :
图片 1

在保险二个网址,原开垦者存款和储蓄日期时,都以行使int数据类型,如二〇一三0218等。现Insus.NET获取这一个字段做其余管理,得先须要把它们转为DateTime数据类型。

从SQL Server的视图INFORMATION_SCHEMA 中用INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 和INFORMATION_SCHEMA.TABLE_CONSTRAINTS七个视图INNE途观JOIN在同步,能够列出须要的数目,上面Insus.NET把它写成多少个自定义函数:

始建八个表值函数:

图片 2图片 3

进而发生以下那些User-Defined Functions(自定义函数卡塔尔:

图片 4图片 5udf_KeyColumns

图片 6图片 7Code
CREATE FUNCTION [dbo].[udf_SystemUser]
(
)
RETURNS @SystemUser TABLE([Account] nvarchar(30),[Password] nvarchar(30))
AS
BEGIN
    INSERT @SystemUser ([Account],[Password]) VALUES('Insus.NET','insus@2009.NET');
    RETURN
END

CREATE FUNCTION [dbo].[udf_SplitStringToTable] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @result TABLE([ID] INT IDENTITY(1,1),value NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string)   1 
    BEGIN 
        IF @end = 0  
            SET @end = LEN(@string)   1

        INSERT INTO @result (value) VALUES (SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end   1 
        SET @end = CHARINDEX(@delimiter, @string, @start)        
    END 
    RETURN 
END

图片 8图片 9udf_ConvertIntDatetime

CREATE FUNCTION [dbo].[udf_KeyColumns] 
(  
)
RETURNS TABLE
AS
RETURN 
(
    SELECT kcu.[TABLE_NAME],kcu.[COLUMN_NAME], kcu.[ORDINAL_POSITION],tc.[CONSTRAINT_TYPE]
    FROM information_schema.key_column_usage AS kcu
    INNER JOIN information_schema.table_constraints AS tc ON 
    (kcu.table_name = tc.table_name AND kcu.[constraint_name] = kcu.[constraint_name])
)

接下来能够在积攒进度,援用这些表值函数:

Source Code

CREATE FUNCTION [dbo].[udf_ConvertIntDatetime]
 (
    @intDate INT
 )  
RETURNS DATETIME 
AS 
BEGIN 
    DECLARE @RTV DATETIME 
    SET @RTV = CONVERT(DATETIME, CAST(@intDate AS CHAR(8)), 112) 
    RETURN @RTV 
END

 

图片 10图片 11Code
CREATE PROCEDURE [dbo].[usp_CheckSystemUser]
(
    @Account nvarchar(30),
    @Password nvarchar(30)
)
AS
IF NOT EXISTS(SELECT * FROM [dbo].[udf_SystemUser]() WHERE [Account]=@Account AND [Password]=@Password)
BEGIN
    RAISERubiconRO奥迪Q5(N'数据证实未被通过,无法登入!',16,1卡塔尔国
    RETURN
END

再写其它一个Scalar-valued Function自定义函数[dbo].[udf_SplitString]:
图片 12

 

举例大家想博得某一个表的主键名称,能够写一个仓库储存进程:

 

图片 13图片 14

上边自定义函数中三个参数112,能够参照下链接最后一句。自定义函数应用:

图片 15图片 16usp_PrimaryKey

 

CREATE FUNCTION [dbo].[udf_SplitString]
(
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1),
    @index INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @rtn NVARCHAR(MAX)
    SELECT @rtn = [value] FROM [dbo].[udf_SplitStringToTable] (@string,@delimiter) WHERE [ID] = @index
    RETURN @rtn
END
GO

SELECT [id],[orderdate],[dbo].[udf_ConvertIntDatetime]([orderdate]) AS [Order_Date] FROM dbo.[orders] 

CREATE PROCEDURE [dbo].[usp_PrimaryKey] (  
    @TableName SYSNAME
)
AS
    DECLARE @ReturnValue NVARCHAR(MAX)
    SELECT @ReturnValue = [COLUMN_NAME] FROM [dbo].[udf_KeyColumns]() 
    WHERE [CONSTRAINT_TYPE] = 'PRIMARY KEY' AND [TABLE_NAME] = @TableName 
    SELECT  @ReturnValue

 

Source Code

 

 

上边代码示例中@index参数便是你想博得第多少个字符串,举个例证吗:
图片 17

 结果:

援引存款和储蓄进度:

 

图片 18

EXECUTE [dbo].[usp_PrimaryKey] 'Member'

 

 

Server创造客户函数与使用,把int类型日期转变为datetime类型日期。下边文字,更新于二〇一三-02-18 17:10
察觉原字段还应该有6位int的日期,年份独有两位,如110317等。因为Insus.NET还须要更新方面包车型客车自定义函数, 有关是选用参数12还得再参考上边链接。:

参照相关:

图片 19图片 20udf_ConvertIntDatetime

SQL Server自定义函数(Scalar-valued Functions卡塔尔

ALTER FUNCTION [dbo].[udf_ConvertIntDatetime]
 (
    @intDate INT
 )  
RETURNS DATETIME 
AS 
BEGIN 
    
Server创造客户函数与使用,把int类型日期转变为datetime类型日期。    DECLARE @RTV DATETIME 
    SET @RTV =    CASE LEN(@intDate)
    WHEN 6 THEN CONVERT(DATETIME, CAST(@intDate AS CHAR(6)),12)
    WHEN 8 THEN CONVERT(DATETIME, CAST(@intDate AS CHAR(8)),112)
    ELSE NULL
    END
    
    RETURN @RTV 
END

SQL Server自定义函数(Table-valued Functions卡塔尔国

 

 

 演示:

图片 21

 

上边文字更新于2011-02-20 00:05

后天本是周末,早晨顾客来电,说一些日期无法显示,展现为空。客商说一笔记录日期为010627时,它就展现为空。客户区域语言分化等,让该函数不可能甄别2位数的年度。独有内定DATEFORMAT技巧精确展现日期。让Insus.NET起从前七个自定义函数,即能够消除此题材:

图片 22图片 23View Code

SELECT [dbo].[ConvertDate] ('010627','yy-MM-dd')
SELECT [dbo].[ConvertDate] ('010627','yyyy-MM-dd')

 

图片 24

 

本文由澳门新萄京发布于数据库,转载请注明出处:Server创造客户函数与使用,把int类型日期转变为

上一篇:澳门新萄京:DB开发规范,MySQL数据库结构设计 下一篇:没有了
猜你喜欢
热门排行
精彩图文