SQL Server

在一个表存在,另一个表不存在的数据

SQL查询~ 存在一个表而不在另一个表中的数据 - jameshappy - 博客园

实例

检验身份证是否合法(数据库函数)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<GAOFEI>
-- Create date: <2022.03.08>
-- Description:	<校验身份证是否合法>
-- =============================================
create function [dbo].[udf_IsvaildIDCard](
@IDCardNo varchar(50) = ''
)
returns bit
as
/*********************************************************************************************************
函数名称:udf_IsvaildIDCard()
参数:@@IDCardNo string 身份证号码
返回值: bit 是否有效(0:无效,1:有效)
功能描述:判断身份证号码是否合法

备注:目前中国的身份证号码有18位和15位。
1,18位身份证号码的组成:6位地区编码 + 8位出生日期 + 3位编号(奇男偶女) + 1位校验码
2,15位身份证号码的组成:6位地区编码 + 6位出生日期 + 3位编号(奇男偶女)
*********************************************************************************************************/
BEGIN
	declare @Lenght int,@Loop int,@Sum int,@SingleChar char
	
	set @Sum = 0
	if @IDCardNo is null or @IDCardNo = null or LTRIM(RTRIM(@IdCardNo)) = '' begin
		return 0
	end
	
	set @Lenght = LEN(@IDCardNo)
	-- 判断位数
	if @Lenght <> 18 and @Lenght <> 15 begin
		return 0
	end
	-- 1.校验18位
	if @Lenght = 18 begin
		if ISNUMERIC(LEFT(@IDCardNo,17)) = 0 begin
			return 0
		end
		if ISDATE(SUBSTRING(@IDCardNo,7,4) + '-'+ SUBSTRING(@IDCardNo,11,2) + '-' + SUBSTRING(@IDCardNo,13,2)) = 0 begin
			return 0
		end
		set @Loop = 17
		while (@Loop >= 1) begin
			set @Sum = @Sum + CONVERT(int,SUBSTRING(@IDCardNo,@Loop,1)) * (POWER(2,(18 - @Loop))% 11)
			set @Loop = @Loop - 1
		end
		set @Loop = @Sum % 11
		if @Loop = 0 begin
			set @SingleChar = '1'
		end
		else if @Loop = 1 begin
			set @SingleChar = '0'
		end
		else if @Loop = 2 begin
			set @SingleChar = 'X'
		end
		else begin
			set @SingleChar = CONVERT(varchar(2),(12 - @Loop))
		end
		if LOWER(RIGHT(@IDCardNo,1)) <> LOWER(@SingleChar) begin
			return 0
		end
	end
	-- 2.校验15位
	else if @Lenght = 15 begin
		if ISNUMERIC(@IDCardNo) = 0 begin
			return 0
		end
		if ISDATE('19' + SUBSTRING(@IDCardNo,7,2) + '-' + SUBSTRING(@IDCardNo,9,2) + '-' + SUBSTRING(@IDCardNo,11,2)) = 0 begin
			return 0
		end
	end
	
	return 1 -- 合法
END
GO

数字转换varchar,并可以保留小数位

注意:是直接舍弃,比如12.356  得到结果是 12.35

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE FUNCTION [dbo].[fn_NumberFormat]
    (
      @number decimal(18,4) ,
      @points INT
    )
RETURNS VARCHAR(8000)
AS
/*
函数名称:fn_NumberFormat()
参数:@number decimal(18,4) 需要转换的数字 
	 @points INT 保留小数位数
返回值:varchar  返回转换位varchar并保留小数位数之后的数据
功能:返回转换为varchar并保留小数位数之后的数据
*/
    BEGIN
		set @number = ISnull(@number,0.00) --若是null,返回0.00
        RETURN LEFT(CONVERT(VARCHAR(MAX),@number), CHARINDEX('.', CONVERT(VARCHAR(MAX),@number))+@points)
    END


GO

汉字URL编码


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

create FUNCTION [dbo].[UrlCode](@url varchar(max))
RETURNS varchar(max)
AS
BEGIN 
    DECLARE @count int, @c char(1), @cenc char(2), @i int, @urlReturn varchar(max)
	,@s varchar(50), @code1 bigint ,@code2 bigint,@h bigint,@m bigint,@l bigint;
    SET @count = Len(@url) 
    SET @i = 1 
    SET @urlReturn = '' 
    WHILE (@i <= @count) 
    BEGIN 
        SET @s = substring(@url, @i, 1) 
		if @s like '[0-9]' or @s like '[a-z]' or @s like '[A-Z]'
		begin
		   SET @s = @s 
		end 
		else if UniCode(@s)<128 
		begin 
			select  @code1=UniCode(@s) 
			select  @s=[dbo].[varbin2hexstr](@code1)
			set  @s='%'+right(@s,2)
		end else begin 
			select  @code1=UniCode(@s),@l=UniCode(@s) &0x3F ,@m=UniCode(@s) &0xFC0 ,@h=UniCode(@s) &0xF000 
			select  @code2=@l+ 0x80  + @m*4 + 0x8000 + @h*16 + 0xE00000
			select  @s=[dbo].[varbin2hexstr](@code2)
			set  @s='%'+left(right(@s,6),2)+'%'+left(right(@s,4),2)+'%'+right(@s,2)		
		end	  
        select  @urlReturn=@urlReturn+@s
        SET @i = @i +1 
     END
 
    RETURN @urlReturn
END

GO


汉字URL解码


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

create FUNCTION [dbo].[UrlDecode](@url varchar(max))
RETURNS varchar(max)
AS
BEGIN 
    DECLARE @count int, @c char(1), @cenc char(2), @i int, @urlReturn varchar(max)
	,@s varchar(50), @code1 bigint ,@code2 bigint,@h bigint,@m bigint,@l bigint;
    SET @count = Len(@url) 
    SET @i = 1 
    SET @urlReturn = '' 
    WHILE (@i <= @count) 
    BEGIN 
        SET @c = substring(@url, @i, 1) 
		if @c='%'
		begin 		    
			if (substring(@url, @i+1, 1) LIKE '[0-9]') and (@i+2<=@count) 
			begin 
			    set @s = substring(@url, @i, 3)
				select  @code1=CONVERT(bigint, CONVERT(varbinary,CAST('0x'+replace(@s,'%','') AS char ) , 1))
				select @urlReturn=@urlReturn+nchar(@code1) 
				SET @i = @i + 3 
			end else  if  (@i+8<=@count) 
			begin 
				set @s = substring(@url, @i, 9)
				select  @code1=CONVERT(bigint, CONVERT(varbinary,CAST('0x'+replace(@s,'%','') AS char ) , 1))
				select @h=@code1&0xF0000,@m=@code1&0x3F00,@l=@code1&0x3F 
				select @code2=(@h/16) + (@m/4) + @l
				select @urlReturn=@urlReturn+nchar(@code2)
				SET @i = @i + 9 
			end else 
			  break
			
		end else begin 
           SET @urlReturn=@urlReturn+@c 
           SET @i = @i +1 
		end
     END
 
    RETURN @urlReturn
END

GO


解析JSON

-- 标量值函数
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[parseJSON_DZPJ] ( @JSON NVARCHAR(MAX) )
RETURNS @hierarchy TABLE
    (
      element_id INT IDENTITY(1, 1)
                     NOT NULL , /* internal surrogate primary key gives the order of parsing and the list order */
      sequenceNo [INT] NULL , /* the place in the sequence for the element */
      parent_ID INT ,/* if the element has a parent then it is in this column. The document is the ultimate parent, so you can get the structure from recursing from the document */
      Object_ID INT ,/* each list or object has an object id. This ties all elements to a parent. Lists are treated as objects here */
      NAME NVARCHAR(2000) ,/* the name of the object */
      StringValue NVARCHAR(MAX) NOT NULL ,/*the string representation of the value of the element. */
      ValueType VARCHAR(10) NOT NULL /* the declared type of the value represented as a string in StringValue*/
 
    )
AS
    BEGIN
 
        DECLARE @FirstObject INT , --the index of the first open bracket found in the JSON string
            @OpenDelimiter INT ,--the index of the next open bracket found in the JSON string
            @NextOpenDelimiter INT ,--the index of subsequent open bracket found in the JSON string
            @NextCloseDelimiter INT ,--the index of subsequent close bracket found in the JSON string
            @Type NVARCHAR(10) ,--whether it denotes an object or an array
            @NextCloseDelimiterChar CHAR(1) ,--either a '}' or a ']'
            @Contents NVARCHAR(MAX) , --the unparsed contents of the bracketed expression
            @Start INT , --index of the start of the token that you are parsing
            @end INT ,--index of the end of the token that you are parsing
            @param INT ,--the parameter at the end of the next Object/Array token
            @EndOfName INT ,--the index of the start of the parameter at end of Object/Array token
            @token NVARCHAR(MAX) ,--either a string or object
            @value NVARCHAR(MAX) , -- the value as a string
            @SequenceNo INT , -- the sequence number within a list
            @name NVARCHAR(200) , --the name as a string
            @parent_ID INT ,--the next parent ID to allocate
            @lenJSON INT ,--the current length of the JSON String
            @characters NCHAR(36) ,--used to convert hex to decimal
            @result BIGINT ,--the value of the hex symbol being parsed
            @index SMALLINT ,--used for parsing the hex value
            @Escape INT; --the index of the next escape character
 
    
 
  
 
        DECLARE @Strings TABLE /* in this temporary table we keep all strings, even the names of the elements, since they are 'escaped' in a different way, and may contain, unescaped, brackets denoting objects or lists. These are replaced in the JSON string by tokens representing the string */
            (
              String_ID INT IDENTITY(1, 1) ,
              StringValue NVARCHAR(MAX)
            );
 
        SELECT--initialise the characters to convert hex to ascii
                @characters = '0123456789abcdefghijklmnopqrstuvwxyz' ,
                @SequenceNo = 0 , --set the sequence no. to something sensible.
 
  /* firstly we process all strings. This is done because [{} and ] aren't escaped in strings, which complicates an iterative parse. */
                @parent_ID = 0;
 
        WHILE 1 = 1 --forever until there is nothing more to do
            BEGIN
 
                SELECT  @Start = PATINDEX('%[^a-zA-Z]["]%',
                                          @JSON COLLATE SQL_Latin1_General_CP850_BIN);--next delimited string
 
                IF @Start = 0
                    BREAK; --no more so drop through the WHILE loop
 
                IF SUBSTRING(@JSON, @Start + 1, 1) = '"'
                    BEGIN --Delimited Name
 
                        SET @Start = @Start + 1;
 
                        SET @end = PATINDEX('%[^\]["]%',
                                            RIGHT(@JSON,
                                                  LEN(@JSON + '|') - @Start));
 
                    END;
 
                IF @end = 0 --no end delimiter to last string
                    BREAK; --no more
 
                SELECT  @token = SUBSTRING(@JSON, @Start + 1, @end - 1);
 
      --now put in the escaped control characters
 
                SELECT  @token = REPLACE(@token, FromString, ToString)
                FROM    ( SELECT    '\"' AS FromString ,
                                    '"' AS ToString
                          UNION ALL
                          SELECT    '\\' ,
                                    '\'
                          UNION ALL
                          SELECT    '\/' ,
                                    '/'
                          UNION ALL
                          SELECT    '\b' ,
                                    CHAR(08)
                          UNION ALL
                          SELECT    '\f' ,
                                    CHAR(12)
                          UNION ALL
                          SELECT    '\n' ,
                                    CHAR(10)
                          UNION ALL
                          SELECT    '\r' ,
                                    CHAR(13)
                          UNION ALL
                          SELECT    '\t' ,
                                    CHAR(09)
                        ) substitutions;
 
                SELECT  @result = 0 ,
                        @Escape = 1;
 
  --Begin to take out any hex escape codes
 
                WHILE @Escape > 0
                    BEGIN
 
                        SELECT  @index = 0 ,
 
          --find the next hex escape sequence
                                @Escape = PATINDEX('%\x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]%',
                                                   @token);
 
                        IF @Escape > 0 --if there is one
                            BEGIN
 
                                WHILE @index < 4 --there are always four digits to a \x sequence 
                                    BEGIN
 
                                        SELECT --determine its value
                                                @result = @result + POWER(16,
                                                              @index)
                                                * ( CHARINDEX(SUBSTRING(@token,
                                                              @Escape + 2 + 3
                                                              - @index, 1),
                                                              @characters) - 1 ) ,
                                                @index = @index + 1;
 
         
 
                                    END;
 
                -- and replace the hex sequence by its unicode value
 
                                SELECT  @token = STUFF(@token, @Escape, 6,
                                                       NCHAR(@result));
 
                            END;
 
                    END;
 
      --now store the string away
 
                INSERT  INTO @Strings
                        ( StringValue )
                        SELECT  @token;
 
      -- and replace the string with a token
 
                SELECT  @JSON = STUFF(@JSON, @Start, @end + 1,
                                      '@string'
                                      + CONVERT(NVARCHAR(5), @@identity));
 
            END;
 
  -- all strings are now removed. Now we find the first leaf.
 
        WHILE 1 = 1  --forever until there is nothing more to do
            BEGIN
 
  
 
                SELECT  @parent_ID = @parent_ID + 1;
 
  --find the first object or list by looking for the open bracket
 
                SELECT  @FirstObject = PATINDEX('%[{[[]%',
                                                @JSON COLLATE SQL_Latin1_General_CP850_BIN);--object or array
 
                IF @FirstObject = 0
                    BREAK;
 
                IF ( SUBSTRING(@JSON, @FirstObject, 1) = '{' )
                    SELECT  @NextCloseDelimiterChar = '}' ,
                            @Type = 'object';
 
                ELSE
                    SELECT  @NextCloseDelimiterChar = ']' ,
                            @Type = 'array';
 
                SELECT  @OpenDelimiter = @FirstObject;
 
  
 
                WHILE 1 = 1 --find the innermost object or list...
                    BEGIN
 
                        SELECT  @lenJSON = LEN(@JSON + '|') - 1;
 
  --find the matching close-delimiter proceeding after the open-delimiter
 
                        SELECT  @NextCloseDelimiter = CHARINDEX(@NextCloseDelimiterChar,
                                                              @JSON,
                                                              @OpenDelimiter
                                                              + 1);
 
  --is there an intervening open-delimiter of either type
 
                        SELECT  @NextOpenDelimiter = PATINDEX('%[{[[]%',
                                                              RIGHT(@JSON,
                                                              @lenJSON
                                                              - @OpenDelimiter)COLLATE SQL_Latin1_General_CP850_BIN);--object
 
                        IF @NextOpenDelimiter = 0
                            BREAK;
 
                        SELECT  @NextOpenDelimiter = @NextOpenDelimiter
                                + @OpenDelimiter;
 
                        IF @NextCloseDelimiter < @NextOpenDelimiter
                            BREAK;
 
                        IF SUBSTRING(@JSON, @NextOpenDelimiter, 1) = '{'
                            SELECT  @NextCloseDelimiterChar = '}' ,
                                    @Type = 'object';
 
                        ELSE
                            SELECT  @NextCloseDelimiterChar = ']' ,
                                    @Type = 'array';
 
                        SELECT  @OpenDelimiter = @NextOpenDelimiter;
 
                    END;
 
  ---and parse out the list or name/value pairs
 
                SELECT  @Contents = SUBSTRING(@JSON, @OpenDelimiter + 1,
                                              @NextCloseDelimiter
                                              - @OpenDelimiter - 1);
 
                SELECT  @JSON = STUFF(@JSON, @OpenDelimiter,
                                      @NextCloseDelimiter - @OpenDelimiter + 1,
                                      '@' + @Type
                                      + CONVERT(NVARCHAR(5), @parent_ID));
 
                WHILE ( PATINDEX('%[A-Za-z0-9@+.e]%',
                                 @Contents COLLATE SQL_Latin1_General_CP850_BIN) ) <> 0
                    BEGIN
 
                        IF @Type = 'Object' --it will be a 0-n list containing a string followed by a string, number,boolean, or null
                            BEGIN
 
                                SELECT  @SequenceNo = 0 ,
                                        @end = CHARINDEX(':', ' ' + @Contents);--if there is anything, it will be a string-based name.
 
                                SELECT  @Start = PATINDEX('%[^A-Za-z@][@]%',
                                                          ' ' + @Contents);--AAAAAAAA
 
                                SELECT  @token = SUBSTRING(' ' + @Contents,
                                                           @Start + 1,
                                                           @end - @Start - 1) ,
                                        @EndOfName = PATINDEX('%[0-9]%',
                                                              @token COLLATE SQL_Latin1_General_CP850_BIN) ,
                                        @param = RIGHT(@token,
                                                       LEN(@token)
                                                       - @EndOfName + 1);
 
                                SELECT  @token = LEFT(@token, @EndOfName - 1) ,
                                        @Contents = RIGHT(' ' + @Contents,
                                                          LEN(' ' + @Contents
                                                              + '|') - @end
                                                          - 1);
 
                                SELECT  @name = StringValue
                                FROM    @Strings
                                WHERE   String_ID = @param; --fetch the name
 
                            END;
 
                        ELSE
                            SELECT  @name = NULL ,
                                    @SequenceNo = @SequenceNo + 1;
 
                        SELECT  @end = CHARINDEX(',', @Contents);-- a string-token, object-token, list-token, number,boolean, or null
 
                        IF @end = 0
                            SELECT  @end = PATINDEX('%[A-Za-z0-9@+.e][^A-Za-z0-9@+.e]%',
                                                    @Contents + ' ') + 1;
 
                        SELECT  @Start = PATINDEX('%[^A-Za-z0-9@+.e][A-Za-z0-9@+.e]%',
                                                  ' ' + @Contents);
 
      --select @start,@end, LEN(@contents+'|'), @contents
 
                        SELECT  @value = RTRIM(SUBSTRING(@Contents, @Start,
                                                         @end - @Start)) ,
                                @Contents = RIGHT(@Contents + ' ',
                                                  LEN(@Contents + '|') - @end);
 
                        IF SUBSTRING(@value, 1, 7) = '@object'
                            INSERT  INTO @hierarchy
                                    ( NAME ,
                                      sequenceNo ,
                                      parent_ID ,
                                      StringValue ,
                                      Object_ID ,
                                      ValueType
                                    )
                                    SELECT  @name ,
                                            @SequenceNo ,
                                            @parent_ID ,
                                            SUBSTRING(@value, 8, 5) ,
                                            SUBSTRING(@value, 8, 5) ,
                                            'object';
 
                        ELSE
                            IF SUBSTRING(@value, 1, 6) = '@array'
                                INSERT  INTO @hierarchy
                                        ( NAME ,
                                          sequenceNo ,
                                          parent_ID ,
                                          StringValue ,
                                          Object_ID ,
                                          ValueType
                                        )
                                        SELECT  @name ,
                                                @SequenceNo ,
                                                @parent_ID ,
                                                SUBSTRING(@value, 7, 5) ,
                                                SUBSTRING(@value, 7, 5) ,
                                                'array';
 
                            ELSE
                                IF SUBSTRING(@value, 1, 7) = '@string'
                                    INSERT  INTO @hierarchy
                                            ( NAME ,
                                              sequenceNo ,
                                              parent_ID ,
                                              StringValue ,
                                              ValueType
                                            )
                                            SELECT  @name ,
                                                    @SequenceNo ,
                                                    @parent_ID ,
                                                    cast(StringValue as text) ,
                                                    'string'
                                            FROM    @Strings
                                            WHERE   String_ID = SUBSTRING(@value,
                                                              8, 5);
 
                                ELSE
                                    IF @value IN ( 'true', 'false' )
                                        INSERT  INTO @hierarchy
                                                ( NAME ,
                                                  sequenceNo ,
                                                  parent_ID ,
                                                  StringValue ,
                                                  ValueType
                                                )
                                                SELECT  @name ,
                                                        @SequenceNo ,
                                                        @parent_ID ,
                                                        @value ,
                                                        'boolean';
 
                                    ELSE
                                        IF @value = 'null'
                                            INSERT  INTO @hierarchy
                                                    ( NAME ,
                                                      sequenceNo ,
                                                      parent_ID ,
                                                      StringValue ,
                                                      ValueType
                                                    )
                                                    SELECT  @name ,
                                                            @SequenceNo ,
                                                            @parent_ID ,
                                                            @value ,
                                                            'null';
 
                                        ELSE
                                            IF PATINDEX('%[^0-9]%',
                                                        @value COLLATE SQL_Latin1_General_CP850_BIN) > 0
                                                INSERT  INTO @hierarchy
                                                        ( NAME ,
                                                          sequenceNo ,
                                                          parent_ID ,
                                                          StringValue ,
                                                          ValueType
                                                        )
                                                        SELECT
                                                              @name ,
                                                              @SequenceNo ,
                                                              @parent_ID ,
                                                              @value ,
                                                              'real';
 
                                            ELSE
                                                INSERT  INTO @hierarchy
                                                        ( NAME ,
                                                          sequenceNo ,
                                                          parent_ID ,
                                                          StringValue ,
                                                          ValueType
                                                        )
                                                        SELECT
                                                              @name ,
                                                              @SequenceNo ,
                                                              @parent_ID ,
                                                              @value ,
                                                              'int';
 
                        IF @Contents = ' '
                            SELECT  @SequenceNo = 0;
 
                    END;
 
            END;
 
        INSERT  INTO @hierarchy
                ( NAME ,
                  sequenceNo ,
                  parent_ID ,
                  StringValue ,
                  Object_ID ,
                  ValueType
                )
                SELECT  '-' ,
                        1 ,
                        NULL ,
                        '' ,
                        @parent_ID - 1 ,
                        @Type;
 
--
 
        RETURN;
 
    END;




GO


在存储过程中使用解析JSON


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

create PROCEDURE [dbo].[sfp_dzpj_parse_rtn] @para varchar(max),@out_para varchar(max) output 
AS
BEGIN
-- 处理数据使用变量
declare @noise varchar(50),@data varchar(max),@result varchar(10),@message varchar(max),@fph varchar(50),@busDateTime varchar(20)
-- 获取数据
select @noise = StringValue from dbo.parseJSON_DZPJ(@para) where NAME = 'noise' -- 获取noise(即唯一号)
select @data = StringValue from dbo.parseJSON_DZPJ(@para) where NAME = 'data' -- 获取电子票据接口返回值(全部)
select @fph = StringValue from dbo.parseJSON_DZPJ(@para) where NAME = 'busNo' -- 发票号
select @busDateTime = StringValue from dbo.parseJSON_DZPJ(@para) where NAME = 'busDateTime' -- 发票上传时的时间
-- base64()解码
SELECT @data = CONVERT(nvarchar(max), dbo.utf8_to_ucs2(dbo.base64_decode(@data)))
select @result = StringValue from dbo.parseJSON_DZPJ(@data) where NAME = 'result' -- 返回结果标识
select @message = StringValue from dbo.parseJSON_DZPJ(@data) where NAME = 'message' -- 返回结果内容
SELECT @message = CONVERT(nvarchar(max), dbo.utf8_to_ucs2(dbo.base64_decode(@message)))
-- 记录日志
insert into DZPJ_LOG_SFP(fph,result,message,noise)
values(@fph,@result,@message,@noise)
if @result <> 'S0000' begin -- 有错误
	set @out_para = @message
	return -- 有错误,直接返回
end
declare @billBatchCode varchar(50),@billNo varchar(20),@random varchar(20),@createTime varchar(20),@billQRCode varchar(max),@pictureUrl varchar(max),@pictureNetUrl varchar(max)
select @billBatchCode = StringValue from dbo.parseJSON_DZPJ(@message) where NAME = 'billBatchCode' -- 电子票据代码
select @billNo = StringValue from dbo.parseJSON_DZPJ(@message) where NAME = 'billNo' -- 电子票据号码
select @random = StringValue from dbo.parseJSON_DZPJ(@message) where NAME = 'random' -- 电子校验码
select @createTime = StringValue from dbo.parseJSON_DZPJ(@message) where NAME = 'createTime' -- 电子票据生成时间
select @billQRCode = StringValue from dbo.parseJSON_DZPJ(@message) where NAME = 'billQRCode' -- 电子票据二维码图片数据
select @pictureUrl = StringValue from dbo.parseJSON_DZPJ(@message) where NAME = 'pictureUrl' -- 电子票据H5页面URL
select @pictureNetUrl = StringValue from dbo.parseJSON_DZPJ(@message) where NAME = 'pictureNetUrl' -- 电子票据外网H5页面URL
-- 成功后,保存数据到表DZPJ_MZFP中,并更改发票是否生成电子票据的状态
update t03dr_fp set if_create_dzpj = 1 where fph = @fph --更改发票是否生成电子票据的状态
insert into DZPJ_MZFP(wyh,interface,fph,billBatchCode,billNo,random,createTime,billQRCode,pictureUrl,pictureNetUrl,czy,busDateTime)
values(@noise,'invEBillRegistration',@fph,@billBatchCode,@billNo,@random,@createTime,dbo.base64_decode(@billQRCode),@pictureUrl,@pictureNetUrl,'zzj01-自助机',@busDateTime)

set @out_para = @billQRCode
END





获取日期数字

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].[fn_dzpj_get_noise]()
returns varchar(50)
as
begin
declare @dh varchar(50)
 	set  @dh = convert(varchar(100),Sysdatetime())
	/*1.第一次把'-'替换为''*/
	set @dh = REPLACE(@dh,'-','')
	/*2.第二次把' '替换为''*/
	set @dh = REPLACE(@dh,' ','')
	/*3.第三次把':'替换为''*/
	set @dh = REPLACE(@dh,':','')
	/*4.第四次把'.'替换为''*/
	return REPLACE(@dh,'.','')
end

获取字符串中的全部数字

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
	--获取字符串中的数字
	CREATE FUNCTION [dbo].[Fun_GetNum] 
	( @Str VARCHAR(200) )
	RETURNS VARCHAR(100)
	AS
		BEGIN
			DECLARE @Start INT;
			DECLARE @End INT; 
			DECLARE @Part NVARCHAR(MAX)
			SET @Start = PATINDEX('%[.,0-9]%', @Str);
			SET @End = PATINDEX('%[.,0-9]%',SUBSTRING(@Str, @Start+1,LEN(@Str) - @Start));
			SET @Part = SUBSTRING(@Str,@Start,1) 
			WHILE  @End >0 
			BEGIN 
					SET @Start = @start+@End
					SET @Part = @Part+SUBSTRING(@Str,@Start,1)       
					SET @End = PATINDEX('%[.,0-9]%',SUBSTRING(@Str, @Start+1,LEN(@Str) - @Start)); 
			END
			if LEN(@Part) = 0 begin --若没有数字(即传入的不含数字),返回0
				set @Part = '0'
			end  
			RETURN  @Part;
		END;


GO

获取 * 左或右面的数字

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

--根据符号(*)获取左右【数字】数据
CREATE FUNCTION [dbo].[Fun_GetNum_BY_FH] 
( @sort VARCHAR(10),@Str VARCHAR(200) )
RETURNS VARCHAR(100)
AS
    BEGIN
    --判断有没有 * 没有返回 空
    if charindex('*',@Str) = 0 begin
				declare @rtn VARCHAR(100)
				select @rtn = dbo.Fun_GetNum(@Str)
				return @rtn
			end 
    if @sort = 'left' begin
			---将*号左面的字符串截取出来,如果规格中没有*号会报错
			set @Str  = substring(@Str,1,charindex('*',@Str)-1)
		end
    else if @sort = 'right' begin
			---将*号右面的的字符串截取出来,如果规格中没有*号会报错
			set @Str  = right(@Str,len(@Str) - charindex('*',@Str))
		 end
	else begin
			return ''
		end
		
        DECLARE @Start INT;
        DECLARE @End INT; 
        DECLARE @Part NVARCHAR(MAX)
        SET @Start = PATINDEX('%[.,0-9]%', @Str);
        SET @End = PATINDEX('%[.,0-9]%',SUBSTRING(@Str, @Start+1,LEN(@Str) - @Start));
        SET @Part = SUBSTRING(@Str,@Start,1) 
        WHILE  @End >0 
        BEGIN 
                SET @Start = @start+@End
                SET @Part = @Part+SUBSTRING(@Str,@Start,1)       
                SET @End = PATINDEX('%[.,0-9]%',SUBSTRING(@Str, @Start+1,LEN(@Str) - @Start)); 
        END
            
        RETURN  @Part;
    END;

GO

 获取字符串中的全部字符

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
	--获取字符串中的字符
	CREATE FUNCTION [dbo].[Fun_GetStr] 
	( @Str VARCHAR(200) )
	RETURNS VARCHAR(100)
	AS
		BEGIN
			DECLARE @Start INT;
			DECLARE @End INT; 
			DECLARE @Part NVARCHAR(MAX)
			SET @Start = PATINDEX('%[a-z,A-Z,吖-座]%', @Str);
			SET @End = PATINDEX('%[a-z,A-Z,吖-座]%',SUBSTRING(@Str, @Start+1,LEN(@Str) - @Start));
			SET @Part = SUBSTRING(@Str,@Start,1) 
			WHILE  @End >0 
			BEGIN 
					SET @Start = @start+@End
					SET @Part = @Part+SUBSTRING(@Str,@Start,1)       
					SET @End = PATINDEX('%[a-z,A-Z,吖-座]%',SUBSTRING(@Str, @Start+1,LEN(@Str) - @Start)); 
			END
			if LEN(@Part) = 0 begin --若没有数字(即传入的不含数字),返回0
				set @Part = '0'
			end  
			RETURN  @Part;
		END;

GO

获取 * 左或右面的数据

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

--获取符号(*)左右数据
CREATE FUNCTION [dbo].[Fun_GetStr_BY_FH] 
( @sort VARCHAR(10),@Str VARCHAR(200) )
RETURNS VARCHAR(100)
AS
    BEGIN
    --判断有没有 * 没有返回 空
    if charindex('*',@Str) = 0 begin
				return ''
			end 
    if @sort = 'left' begin
			---将*号左面的字符串截取出来,如果规格中没有*号会报错
			set @Str  = substring(@Str,1,charindex('*',@Str)-1)
		end
    else if @sort = 'right' begin
			---将*号右面的的字符串截取出来,如果规格中没有*号会报错
			set @Str  = right(@Str,len(@Str) - charindex('*',@Str))
		 end         
        RETURN  @Str;
    END;
GO

base64解码


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[base64_decode]
(
@encoded_text varchar(max)
)
RETURNS varbinary(max)
AS
BEGIN
DECLARE
    @output varbinary(max),
    @block_start int,
    @encoded_length int,
    @decoded_length int,
    @mapr binary(122)
IF LEN(@encoded_text) & 3 > 0
    OR @encoded_text LIKE '%[^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=]%' COLLATE Latin1_General_Bin
    RETURN NULL
SET @output = 0x
-- The nth byte of @mapr contains the base64 value of the character with an ASCII value of n.
-- eg. 65th byte = 0x00 = 0 = value of 'A'
SET @mapr =
          0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -- 1-33
        + 0xFFFFFFFFFFFFFFFFFFFF3EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF -- 33-64
        + 0x000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF -- 65-96
        + 0x1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 -- 97-122
--get the number of blocks to be decoded
SET @encoded_length = LEN(@encoded_text)
SET @decoded_length = @encoded_length / 4 * 3
--for each block
SET @block_start = 1
WHILE @block_start < @encoded_length
BEGIN
    --decode the block and add to output
    --BINARY values between 1 and 4 bytes can be implicitly cast to INT
    SET @output = @output +
        CAST(CAST(
              SUBSTRING(@mapr, ASCII(SUBSTRING(@encoded_text, @block_start    , 1)), 1) * 262144
            + SUBSTRING(@mapr, ASCII(SUBSTRING(@encoded_text, @block_start + 1, 1)), 1) * 4096
            + SUBSTRING(@mapr, ASCII(SUBSTRING(@encoded_text, @block_start + 2, 1)), 1) * 64
            + SUBSTRING(@mapr, ASCII(SUBSTRING(@encoded_text, @block_start + 3, 1)), 1)
        AS int) AS binary(3))
    SET @block_start = @block_start + 4
END
IF RIGHT(@encoded_text, 2) = '=='
    SET @decoded_length = @decoded_length - 2
ELSE IF RIGHT(@encoded_text, 1) = '='
    SET @decoded_length = @decoded_length - 1
RETURN SUBSTRING(@output, 1, @decoded_length)
END


GO


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
身份证号码验证算法 (一) 18身份证号码的结构   公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。 排列顺序从左至右依次为:六位数字地址码 + 八位数字出生日期码 + 三位数字顺序码 + 一位校验码。 1、地址码   表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。   /*身份证的行政区域编码表,从统计局官网和网上可以下载,设定county_sar_code为6位行政编码*/ 2、出生日期码   表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 3、顺序码   表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 4、校验码计算步骤 (1)十七位数字本体码加权求和公式   S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和   Ai:表示第i位置上的身份证号码数字值(0~9)   Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子,计算的逻辑:第i位对应的数为[2^(18-i)]mod11) (2)计算模   Y = mod(S, 11) (3)根据模,查找得到对应的校验码   Y: 0 1 2 3 4 5 6 7 8 9 10   校验码: 1 0 X 9 8 7 6 5 4 3 2 (二) 说明 1.程序可以根据已有的17位数字本体码,获取对应的验证码。 2.该程序可以剔除验证码不正确的身份证号码。 3.15位的身份证出生年份采用年份后2位,没有最后1位校验码。 4.完整的身份证18位,最后一位校验位可能是非数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值