Validar mês e ano SQL Server 2019!
Uma maneira simples e eficiente de validar parâmetros passados em consultas, stored procedures, funções.
Vez o outro precisamos de uma forma de validar parâmetros de mês e ano, ou ainda limitar os ranges de utilização. Segue uma maneira simples para fazermos isso.
Então, sem muitas delongas. Veja:
/*
Funcionalidade: Validar o mês no SQL Criado em: 18/05/2010 Criado por: Anderson Abreu Descrição: Validar parâmetro mes como variável Regras: */ use master GO if db_id('tst_database') is not null drop database tst_database go create database tst_database go use tst_database go CREATE FUNCTION [dbo].[fg_verifica_ano] ( @ano int ) RETURNS bit as BEGIN DECLARE @valido bit IF @ano IS NOT NULL BEGIN SET @valido = 0 IF len(@ano) = 4 AND @ano >= 2004 and @ano <= 2200 BEGIN SET @valido=1 END END RETURN @valido END go CREATE FUNCTION [dbo].[fg_verifica_mes] ( @mes int ) RETURNS bit as BEGIN DECLARE @valido bit IF @mes IS NOT NULL BEGIN SET @valido = 0 IF @mes between 1 and 12 BEGIN SET @valido=1 END END RETURN @valido END go -- Vamos Testar select dbo.fg_verifica_ano(2020) select dbo.fg_verifica_ano(202) -- Erro select dbo.fg_verifica_mes(12) select dbo.fg_verifica_mes(13) -- Erro create procedure proc_mes_ano (@mes tinyint, @ano smallint) as begin set nocount on set dateformat YMD declare @checkError bit = 0, @dtInicio varchar(20), @dtFim varchar(20); if OBJECT_ID('tempdb.dbo.#temp_error', 'U') is not null drop table #temp_error; create table #temp_error ( name varchar(255) ); IF dbo.fg_verifica_ano(@ano) = 0 begin insert into #temp_error values ('Ano inválido') set @checkError = 1 end IF @mes is not null IF dbo.fg_verifica_mes(@mes) = 0 begin insert into #temp_error values ('Mês inválido') set @checkError = 1 end if @checkError = 1 Select * from #temp_error else begin if OBJECT_ID('tempdb.dbo.#temp_all', 'U') IS NOT NULL drop table #temp_all; if @mes = 1 set @dtInicio = cast(cast(@ano-1 as char(4)) +'-'+ cast((12) as varchar(2)) +'-1 00:00' as datetime) else set @dtInicio = cast(cast(@ano as char(4)) +'-'+ cast((@mes-1) as varchar(2)) +'-2 00:00' as datetime) set @dtFim = cast(cast(@ano as char(4)) +'-'+ cast((@mes) as varchar(2)) +'-21 00:00' as datetime) select * from sys.databases where create_date between @dtInicio and @dtFim end set nocount off end declare @mes tinyint = month(getdate()), @ano smallint = year(getdate()) exec proc_mes_ano @mes, @ano GO --Produzindo o erro exec proc_mes_ano 13, 2020 GO exec proc_mes_ano 11, 202 GO exec proc_mes_ano 0, 202 GO -- Excluindo dados de teste use master go drop database tst_database go |
---|