none
SP PARAMETROS OBRGATORIOS RRS feed

  • Pergunta

  •  

    Ola Pessoal,

    trabalho com desenvolvimento a pouco tempo, estou desenvolvendo uma procedure em SQLSERVER que recebe os parametros e dependendo do parametro @modo a SP consulta, altera ou incluir um registro no banco, a procedure já esta compilada e funcionando, porem ela requer que todos os paramentros são preenchidos, gostaria de saber se tem como fazer com que os parametros não sejem obrigatorios!

     

    Code Snippet

    set ANSI_NULLS ON

    set QUOTED_IDENTIFIER ON

    go

    ALTER PROCEDURE [dbo].[ST_CLIENTE]

    --DECLARE @ESTADOCIVIL AS NCHAR(1)

    --DECLARE @NATUREZAJURIDICA AS NCHAR(1)

    @MODO AS VARCHAR(5),

    @NOMECLIENTE AS VARCHAR(60),

    @DTNASCIMENTO AS VARCHAR(20),

    @NATURALIDADE AS VARCHAR(40),

    @SEXO AS VARCHAR(1),

    @UFNASCIMENTO AS VARCHAR(15),

    @CPFCNPJ AS VARCHAR(15),

    @NATUREZAJURIDICAORIGEM AS VARCHAR(20),

    @ESTADOCIVILORIGEM AS VARCHAR(10),

    @FONERESIDENCIAL AS VARCHAR(15),

    @FONECOMERCIAL AS VARCHAR(15),

    @FONECELULAR AS VARCHAR(60),

    @EMAILCLIENTE AS VARCHAR(90),

    @ENDERECOCLIENTE AS VARCHAR(40),

    @COMPLEMENTOENDERECOCLIENTE AS VARCHAR(40),

    @BAIRROENDERECOCLIENTE AS VARCHAR(15),

    @CEPENDERECOCLIENTE AS VARCHAR(50),

    @CODIGOCIDADE AS INT,

    @STATUS AS INT,

    @LIMITECREDITO AS MONEY,

    @DTCADASTRO AS VARCHAR(20)

    AS

    IF @MODO= 'INC'

    BEGIN

    INSERT INTO TBCLIENTES(

    NOMECLIENTE,

    DTNASCIMENTO,

    NATURALIDADE,

    SEXO,

    UFNASCIMENTO,

    CPFCNPJ,

    NATUREZAJURIDICA,

    ESTADOCIVIL,

    FONERESIDENCIAL,

    FONECOMERCIAL,

    FONECELULAR ,

    EMAILCLIENTE,

    ENDERECOCLIENTE,

    COMPLEMENTOENDERECOCLIENTE,

    BAIRROENDERECOCLIENTE,

    CEPENDERECOCLIENTE,

    CODIGOCIDADE,

    STATUS,

    LIMITECREDITO,

    DTCADASTRO)

    VALUES(

    @NOMECLIENTE,

    @DTNASCIMENTO,

    @NATURALIDADE,

    @SEXO,

    @UFNASCIMENTO,

    @CPFCNPJ,

    @NATUREZAJURIDICAORIGEM,

    @ESTADOCIVILORIGEM,

    @FONERESIDENCIAL,

    @FONECOMERCIAL,

    @FONECELULAR ,

    @EMAILCLIENTE,

    @ENDERECOCLIENTE,

    @COMPLEMENTOENDERECOCLIENTE,

    @BAIRROENDERECOCLIENTE,

    @CEPENDERECOCLIENTE,

    @CODIGOCIDADE,

    @STATUS,

    @LIMITECREDITO,

    convert(DATETIME, @DTCADASTRO, 103))

    END

    IF @MODO= 'CONS'

    BEGIN

    SELECT NOMECLIENTE FROM TBCLIENTES;

    END

     

     

    obrigado!

     

     

    sexta-feira, 3 de outubro de 2008 16:13

Respostas

  • Boa Tarde,

     

    Você pode colocar um NULL. Ex:

     

    Code Snippet

    CREATE PROCEDURE uspTeste

    @Val1 INT = NULL,

    @Val2 INT = NULL

    AS

    SELECT ISNULL(@Val1,0) + ISNULL(@Val2,0)

    GO

    exec uspTeste

    exec uspTeste @Val1 = 1

    exec uspTeste @Val2 = 5

    exec uspTeste @Val1 = 4, @Val2 = 3

     

     

    Isso resolverá suas dúvidas mas irá criar outros problemas. Fora o fato de que seus parâmetros deverão ser nomeaados, ou seja, você não poderá confiar apenas na posição, você ainda terá que fazer alguns controles adicionais (se determinado parâmetro for nulo, então outros parâmetros tem de ser obrigatórios). Esses são sintomas de deficiência da tal da super procedure, ou seja, aquela SP que faz tudo. Se você estiver nesse tipo de situação, recomendo criar uma SP para cada ação.

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 3 de outubro de 2008 16:35
  • Leandro,

     

    Você pode sim fazer isso é só colocar a diretiva NULL, veja o exemplo abaixo:

     

    Code Snippet

    Create Procedure P_Teste @Codigo Int = NULL

    As

    Begin

    Select * from Produtos

    Where Codigo = @Codigo

    End

     

     

    sexta-feira, 3 de outubro de 2008 17:03

Todas as Respostas

  • Boa Tarde,

     

    Você pode colocar um NULL. Ex:

     

    Code Snippet

    CREATE PROCEDURE uspTeste

    @Val1 INT = NULL,

    @Val2 INT = NULL

    AS

    SELECT ISNULL(@Val1,0) + ISNULL(@Val2,0)

    GO

    exec uspTeste

    exec uspTeste @Val1 = 1

    exec uspTeste @Val2 = 5

    exec uspTeste @Val1 = 4, @Val2 = 3

     

     

    Isso resolverá suas dúvidas mas irá criar outros problemas. Fora o fato de que seus parâmetros deverão ser nomeaados, ou seja, você não poderá confiar apenas na posição, você ainda terá que fazer alguns controles adicionais (se determinado parâmetro for nulo, então outros parâmetros tem de ser obrigatórios). Esses são sintomas de deficiência da tal da super procedure, ou seja, aquela SP que faz tudo. Se você estiver nesse tipo de situação, recomendo criar uma SP para cada ação.

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 3 de outubro de 2008 16:35
  • Obrigado, pela ajuda vou seguir o sua recomendação
    sexta-feira, 3 de outubro de 2008 16:59
  • Leandro,

     

    Você pode sim fazer isso é só colocar a diretiva NULL, veja o exemplo abaixo:

     

    Code Snippet

    Create Procedure P_Teste @Codigo Int = NULL

    As

    Begin

    Select * from Produtos

    Where Codigo = @Codigo

    End

     

     

    sexta-feira, 3 de outubro de 2008 17:03