几个编写的T-SQL 函数,处理数据

概述

  • 为了数据处理方便, 编写几个函数用于处理数据.

    日期处理

    根据传入日期, 返回改日期当月日期, 因为前端控件大多数不做处理, 类似数字的floor操作

/*----------------------------------------------------------*/
/*    [F0_GetMonthBeginDateTime]                            */
/*----------------------------------------------------------*/
IF EXISTS ( SELECT 1 FROM sys.objects o WHERE object_id = object_id( N'[F0_GetMonthBeginDateTime]' ) AND OBJECTPROPERTY( object_id, N'IsTableFunction') IS NOT NULL )
DROP FUNCTION [F0_GetMonthBeginDateTime]
GO
 
CREATE FUNCTION [dbo].[F0_GetMonthBeginDateTime]
(
@dt DATETIME
)
/*
功能:取得传入日期的月初日期 如:2014-10-01 00:00:00.000
*/
RETURNS DATETIME 
AS
BEGIN
  --SET @dt=CAST(CONVERT(VARCHAR(10), @dt, 121) AS DATETIME)
  --RETURN @dt    
  RETURN CAST(CAST(YEAR(@dt) AS VARCHAR)+'-'+RIGHT(CAST(100+MONTH(@dt) AS VARCHAR), 2)+'-01' AS DATETIME)
END
GO

字符处理

字符串去重

/*----------------------------------------------------------*/
/*    [F0SplitDistinctString]                               */
/*----------------------------------------------------------*/
IF EXISTS ( SELECT 1 FROM sys.objects o WHERE object_id = object_id( N'[F0SplitDistinctString]' ) AND OBJECTPROPERTY( object_id, N'IsTableFunction') IS NOT NULL )
DROP FUNCTION [F0SplitDistinctString]
GO
 
CREATE FUNCTION [dbo].[F0SplitDistinctString]
( 
@String VARCHAR(max),
@Separator VARCHAR(1)
)
RETURNS VARCHAR(MAX) 
AS
/*
功能:以符号@Separator隔开的字符串去重
参数:@String 以逗号分隔的字符串
*/
BEGIN
   DECLARE @Str VARCHAR(MAX)
   DECLARE @Return VARCHAR(MAX) = ''
    
   --拆分IDs
   WHILE CHARINDEX( @Separator, @String ) > 0 
   BEGIN
      --截取第一个ID
      SELECT @Str = LEFT( @String, CHARINDEX( @Separator, @String ) - 1 )
      IF( @Str <> '' )
      BEGIN
            IF CHARINDEX( @Separator + @Str + @Separator, @Separator + @Return + @Separator ) = 0
            BEGIN
                SET @Return = @Return + CASE WHEN @Return = '' THEN '' ELSE ',' END + @Str  
         END
      END
      --截取剩余的IDs
      SELECT @String = RIGHT( @String, LEN( @String ) - CHARINDEX( @Separator, @String ) )
   END
   
   IF( @String <> '' )
   BEGIN
        IF CHARINDEX( @Separator + @String + @Separator, @Separator + @Return + @Separator ) = 0
        BEGIN
            SET @Return = @Return + CASE WHEN @Return = '' THEN '' ELSE ',' END + @String   
        END
   END
   RETURN @Return
 
END
GO

拆分一个以逗号分隔的字符串,将拆分的结果存入一个临时表并返回

/*----------------------------------------------------------*/
/*    [F0SplitIDs]                                          */
/*----------------------------------------------------------*/
IF EXISTS ( SELECT 1 FROM sys.objects o WHERE object_id = object_id( N'[F0SplitIDs]' ) AND OBJECTPROPERTY( object_id, N'IsTableFunction') IS NOT NULL )
DROP FUNCTION [F0SplitIDs]
GO
CREATE FUNCTION [dbo].[F0SplitIDs]
( 
@IDs VARCHAR(MAX) 
)
RETURNS @Return TABLE 
( ID VARCHAR(MAX) )
AS
/*
功能:拆分一个以逗号分隔的字符串,将拆分的结果存入一个临时表并返回
参数:@IDs 以逗号分隔的字符串
*/
BEGIN
   DECLARE @ID VARCHAR(MAX), 
           @Separator VARCHAR(1)
   SET @Separator = ',' 
   
   --拆分IDs
   WHILE CHARINDEX( @Separator, @IDs ) > 0 
   BEGIN
      --截取第一个ID
      SELECT @ID = LEFT( @IDs, CHARINDEX( @Separator, @IDs ) - 1 )
      IF( @ID <> '' )
      BEGIN
         INSERT INTO @Return( ID ) VALUES ( @ID ) 
      END
      
      --截取剩余的IDs
      SELECT @IDs = RIGHT( @IDs, LEN( @IDs ) - CHARINDEX( @Separator, @IDs ) )
   END
   
   IF( @IDs <> '' )
   BEGIN
      INSERT INTO @Return( ID ) VALUES ( @IDs ) 
   END
   RETURN
 
END
GO

猜你喜欢

转载自www.cnblogs.com/hijushen/p/10454684.html