none
Update Condicional RRS feed

  • Pergunta

  •  

    Boa noite,

    Pessoal estou com o seguinte problema, alias um belo de um problema.

    Estou a utilizar uma tabela enorme no SQL 2000 e batata, deu problema com o tamanho do registro que atingiu mais que 8060 bytes, sendo assim como solução pensei na seguinte rotina.

     

    Criei propriedades no codigo C# que cria uma lista de inserção, sendo que primeiro eu insiro a chave e depois vou dando update.

     

    Porém mesmo dessa forma tive problema com o tamanho do registro...

     

    Fiz da seguinte forma, a proc de update

     

     

    set ANSI_NULLS ON

    set QUOTED_IDENTIFIER ON

    go

     

    ALTER PROCEDURE [dbo].[PROC_TBIPC_LAUDOINSPECAOI_ALT]

    (

    @ID_LAUDOINSPECAOI INT output,

    @NOMEDOINSPETOR VARCHAR(80)= NULL,

    @CODIGOINSPETOR VARCHAR(80)= NULL,

    @DATADAINSPECAO DATETIME = NULL,

    @NOMEDOSEGURADO VARCHAR(80) = NULL,

    @NOMEPROPRIEDADERURAL VARCHAR(80) = NULL,

    @PONTOGPSLATIDUDE VARCHAR(80) = NULL,

    @PONTOGPSLONGITUDE VARCHAR(80) = NULL,

    @PONTOGPSALTITUDE VARCHAR(80) = NULL,

    @MUNICIPIO SMALLINT = NULL,

    @UF SMALLINT = NULL,

    @SOJA SMALLINT = NULL,

    @MILHO SMALLINT = NULL,

    @ALGODAO SMALLINT = NULL,

    @OUTRASCULTURAS SMALLINT = NULL,

    @TIPODECULTURAESPECIFICAR VARCHAR(500) = NULL,

    @NOMEDOCULTIVADOR VARCHAR(80) = NULL,

    @AREASEGURADA VARCHAR(7) = NULL,

    @CULTURAANTERIOR VARCHAR(80) = NULL,

    @PRODUTIVIDADEESPERADA VARCHAR(7) = NULL,

    @DESENVOLVIMENTOLAVOURA SMALLINT = NULL,

    @DESENVOLVIMENTODALAVOURA VARCHAR(150) = NULL,

    @ALTERACAOPRODUTIVIDADE SMALLINT = NULL,

    @ALTERACAONAPRODUTIVIDADE VARCHAR(150) = NULL,

    @TECNICAEFETIVAPLANTIO SMALLINT = NULL,

    @PLANTIOCONVENCIONAL SMALLINT = NULL,

    @OUTRAPLANTIO SMALLINT = NULL,

    @TECNICAEFETIVAPLANTIOOUTRO VARCHAR(200) = NULL,

    @DENSIDADEDEPLANTIO VARCHAR(7) = NULL,

    @ESPACAMENTOENTRELINHAS VARCHAR(7) = NULL,

    @GERMINACAO VARCHAR(5) = NULL,

    @STAND SMALLINT = NULL,

    @STANDOUTROS VARCHAR(150) = NULL,

    @VALORSTAND VARCHAR(8) = NULL,

    @ADUBACAOSEMEADORA SMALLINT = null,

    @FORMULAADUBACAOSEMEADORA VARCHAR(20) = NULL,

    @DOSEADUBACAOSEMEADORA VARCHAR(20) = NULL,

    @ADUBACAOCOBERTURA SMALLINT = NULL,

    @FORMULAADUBACAOCOBERTURA VARCHAR(1) = NULL,

    @DOSEADUBACAOCOBERTURA VARCHAR(20) = NULL,

    @DATAINICIOPLANTIO DATETIME = NULL,

    @DATAINICIOCOLHEITA DATETIME = NULL,

    @FATORESQUEPODEMALTERARPRODUTIVIDADE SMALLINT = NULL,

    @CONDICOESCLIMATICAS SMALLINT = NULL,

    @UNIFORMIDADEPLANTAS SMALLINT = NULL,

    @UNIFORMIDADEDASPLANTASOUTRO VARCHAR(200) = NULL,

    @GRAUDESENVOLVIMENTO SMALLINT = NULL,

    @GRAUDEDESENVOLVIMENTODACULTURA VARCHAR(150) = NULL,

    @AFETADADANOCOBERTO SMALLINT = NULL,

    @AFETADADANOCOBERTODESCRICAO VARCHAR(200) = NULL,

    @RECOMENDANIVELGARANTIA SMALLINT = NULL,

    @RECOMENDANIVELGARANTIADESCRICAO VARCHAR(200) = NULL,

    @QUEDAPRODUCAO SMALLINT = NULL,

    @QUEDAPRODUCAODESCRICAO VARCHAR(200) = NULL,

    @CONSIDERACOESSOBRERISCOS VARCHAR(3000) = NULL,

    @LOCALDATASEGURADO DATETIME = NULL,

    @NOMESEGURADO VARCHAR(80) = NULL,

    @ASSINATURASEGURADO VARCHAR(80) = NULL,

    @LOCALDATAINSPETOR DATETIME = NULL,

    @NOMEINSPETOR VARCHAR(80) = NULL,

    @CREA VARCHAR(15) = NULL,

    @ASSINATURAINSPETOR VARCHAR(80) = NULL

    )

    AS

    BEGIN

    /*

    Procedure para Alterar conteudo da tabela TBIPC_LAUDOINSPECAOI

    */

    SET NOCOUNT ON

    UPDATE TBIPC_LAUDOINSPECAOI WITH(ROWLOCK)

    SET NOMEDOINSPETOR = ISNULL(@NOMEDOINSPETOR,NOMEDOINSPETOR),

    CODIGOINSPETOR = ISNULL(@CODIGOINSPETOR,CODIGOINSPETOR),

    DATADAINSPECAO = ISNULL(@DATADAINSPECAO,DATADAINSPECAO),

    NOMEDOSEGURADO = ISNULL(@NOMEDOSEGURADO,NOMEDOSEGURADO ),

    NOMEPROPRIEDADERURAL = ISNULL(@NOMEPROPRIEDADERURAL,NOMEPROPRIEDADERURAL ),

    PONTOGPSLATIDUDE = ISNULL(@PONTOGPSLATIDUDE,PONTOGPSLATIDUDE ),

    PONTOGPSLONGITUDE = ISNULL(@PONTOGPSLONGITUDE,PONTOGPSLONGITUDE),

    PONTOGPSALTITUDE = ISNULL( @PONTOGPSALTITUDE,PONTOGPSALTITUDE ),

    MUNICIPIO = ISNULL(@MUNICIPIO,MUNICIPIO ),

    UF = ISNULL( @UF,UF ),

    SOJA = ISNULL(@SOJA,SOJA ),

    MILHO = ISNULL(@MILHO,MILHO),

    ALGODAO = ISNULL(@ALGODAO,ALGODAO ),

    OUTRASCULTURAS = ISNULL(@OUTRASCULTURAS,OUTRASCULTURAS ),

    TIPODECULTURAESPECIFICAR = ISNULL(@TIPODECULTURAESPECIFICAR,TIPODECULTURAESPECIFICAR ),

    NOMEDOCULTIVADOR = ISNULL(@NOMEDOCULTIVADOR,NOMEDOCULTIVADOR ),

    AREASEGURADA = ISNULL(@AREASEGURADA,AREASEGURADA ),

    CULTURAANTERIOR = ISNULL(@CULTURAANTERIOR,CULTURAANTERIOR ),

    PRODUTIVIDADEESPERADA = ISNULL(@PRODUTIVIDADEESPERADA,PRODUTIVIDADEESPERADA ),

    DESENVOLVIMENTOLAVOURA = ISNULL(@DESENVOLVIMENTOLAVOURA,DESENVOLVIMENTOLAVOURA),

    DESENVOLVIMENTODALAVOURA = ISNULL(@DESENVOLVIMENTODALAVOURA,DESENVOLVIMENTODALAVOURA ),

    ALTERACAOPRODUTIVIDADE = ISNULL(@ALTERACAOPRODUTIVIDADE,ALTERACAOPRODUTIVIDADE ),

    ALTERACAONAPRODUTIVIDADE = ISNULL(@ALTERACAONAPRODUTIVIDADE,ALTERACAONAPRODUTIVIDADE ),

    TECNICAEFETIVAPLANTIO = ISNULL(@TECNICAEFETIVAPLANTIO,TECNICAEFETIVAPLANTIO ),

    PLANTIOCONVENCIONAL = ISNULL(@PLANTIOCONVENCIONAL,PLANTIOCONVENCIONAL ),

    OUTRAPLANTIO = ISNULL(@OUTRAPLANTIO,OUTRAPLANTIO ),

    TECNICAEFETIVAPLANTIOOUTRO = ISNULL(@TECNICAEFETIVAPLANTIOOUTRO,TECNICAEFETIVAPLANTIOOUTRO ),

    DENSIDADEDEPLANTIO = ISNULL(@DENSIDADEDEPLANTIO,DENSIDADEDEPLANTIO ),

    ESPACAMENTOENTRELINHAS = ISNULL(@ESPACAMENTOENTRELINHAS,ESPACAMENTOENTRELINHAS ),

    GERMINACAO = ISNULL(@GERMINACAO,GERMINACAO ),

    STAND = ISNULL(@STAND, STAND),

    STANDOUTROS = ISNULL(@STANDOUTROS,STANDOUTROS ),

    VALORSTAND = ISNULL(@VALORSTAND,VALORSTAND ),

    ADUBACAOSEMEADORA = ISNULL(@ADUBACAOSEMEADORA,ADUBACAOSEMEADORA ),

    FORMULAADUBACAOSEMEADORA = ISNULL(@FORMULAADUBACAOSEMEADORA,FORMULAADUBACAOSEMEADORA ),

    DOSEADUBACAOSEMEADORA = ISNULL(@DOSEADUBACAOSEMEADORA,DOSEADUBACAOSEMEADORA ),

    ADUBACAOCOBERTURA = ISNULL(@ADUBACAOCOBERTURA, ADUBACAOCOBERTURA),

    FORMULAADUBACAOCOBERTURA = ISNULL(@FORMULAADUBACAOCOBERTURA,FORMULAADUBACAOCOBERTURA ),

    DOSEADUBACAOCOBERTURA = ISNULL(@DOSEADUBACAOCOBERTURA,DOSEADUBACAOCOBERTURA ),

    DATAINICIOPLANTIO = ISNULL(@DATAINICIOPLANTIO,DATAINICIOPLANTIO ),

    DATAINICIOCOLHEITA = ISNULL(@DATAINICIOCOLHEITA,DATAINICIOCOLHEITA),

    FATORESQUEPODEMALTERARPRODUTIVIDADE = ISNULL(@FATORESQUEPODEMALTERARPRODUTIVIDADE,FATORESQUEPODEMALTERARPRODUTIVIDADE ),

    CONDICOESCLIMATICAS = ISNULL(@CONDICOESCLIMATICAS,CONDICOESCLIMATICAS ),

    UNIFORMIDADEPLANTAS = ISNULL(@UNIFORMIDADEPLANTAS,UNIFORMIDADEPLANTAS),

    UNIFORMIDADEDASPLANTASOUTRO = ISNULL(@UNIFORMIDADEDASPLANTASOUTRO,UNIFORMIDADEDASPLANTASOUTRO ),

    GRAUDESENVOLVIMENTO = ISNULL(@GRAUDESENVOLVIMENTO,GRAUDESENVOLVIMENTO ),

    GRAUDEDESENVOLVIMENTODACULTURA = ISNULL(@GRAUDEDESENVOLVIMENTODACULTURA,GRAUDEDESENVOLVIMENTODACULTURA ),

    AFETADADANOCOBERTO = ISNULL(@AFETADADANOCOBERTO,AFETADADANOCOBERTO),

    AFETADADANOCOBERTODESCRICAO = ISNULL(@AFETADADANOCOBERTODESCRICAO,AFETADADANOCOBERTODESCRICAO ),

    RECOMENDANIVELGARANTIA = ISNULL(@RECOMENDANIVELGARANTIA,RECOMENDANIVELGARANTIA ),

    RECOMENDANIVELGARANTIADESCRICAO = ISNULL(@RECOMENDANIVELGARANTIADESCRICAO,RECOMENDANIVELGARANTIADESCRICAO ),

    QUEDAPRODUCAO = ISNULL(@QUEDAPRODUCAO,QUEDAPRODUCAO ),

    QUEDAPRODUCAODESCRICAO = ISNULL(@QUEDAPRODUCAODESCRICAO,QUEDAPRODUCAODESCRICAO ),

    CONSIDERACOESSOBRERISCOS = ISNULL(@CONSIDERACOESSOBRERISCOS,CONSIDERACOESSOBRERISCOS),

    LOCALDATASEGURADO = ISNULL(@LOCALDATASEGURADO,LOCALDATASEGURADO ),

    NOMESEGURADO = ISNULL(@NOMESEGURADO,NOMESEGURADO ),

    ASSINATURASEGURADO = ISNULL(@ASSINATURASEGURADO,ASSINATURASEGURADO ),

    LOCALDATAINSPETOR = ISNULL(@LOCALDATAINSPETOR,LOCALDATAINSPETOR ),

    NOMEINSPETOR = ISNULL(@NOMEINSPETOR,NOMEINSPETOR ),

    CREA = ISNULL(@CREA,CREA ),

    ASSINATURAINSPETOR = ISNULL(@ASSINATURAINSPETOR,ASSINATURAINSPETOR)

    WHERE ID_LAUDOINSPECAOI = @ID_LAUDOINSPECAOI

    SET NOCOUNT OFF

    END

     

    Utilizei o ISNULL() para verificar se o parametro for nulo eu preencho com o valor do proprio campo, porem com isso, acabo gerando no final um update do mesmo tamanho...

     

    Gostaria de saber se ha uma função que eu consiga apenas verificar se o parametro e diferente do campo, e inserir somente nesse caso...

     

    Obrigado....

     

    quarta-feira, 17 de outubro de 2007 23:36

Todas as Respostas

  •  

    Oi !

     

    Não sei se entendi bem o que você deseja fazer com esse update, mas o caminho não é por ai não...

     

    Vamos analisar os seus campos, pelo menos o que deu para ver dos seus campos observando os parâmetros da procedure :

     

    @CODIGOINSPETOR VARCHAR(80)= NULL :

     

    Por que o código do inspetor tem 80 caracteres, mesmo tamanho até que o nome do inspetor ? Acho improvavel esta situação...

     

    Considerando que a tabela é de inspeção, acontecimento da inspeção e você tem um código do inspetor, então você tem uma tabela de inspetores em separado. Assim sendo o nome do inspetor não deveria estar nessa tabela.

     

     

    @DATADAINSPECAO DATETIME = NULL

     

    Precisa mesmo ser dateTime, não pode ser smallDateTime ?

     

    @MUNICIPIO SMALLINT = NULL

     

    Se o municipio é smallINT então existe uma tabela de municipios. Nesse caso o campo UF estaria ligado na tabela de municipios e não na tabela de inspeção.

     

    @TIPODECULTURAESPECIFICAR VARCHAR(500) = NULL

     

    Pensou na possibilidade de jogar isso como TEXT e usar TextInRow nos casos em que for possível e cuidadosamente ?

     

    @DATAINICIOPLANTIO DATETIME = NULL

    @DATAINICIOCOLHEITA DATETIME = NULL

     

    Esses dois também não poderiam estar como SmallDateTime ?

     

    @UNIFORMIDADEDASPLANTASOUTRO VARCHAR(200) = NULL

    @GRAUDEDESENVOLVIMENTODACULTURA VARCHAR(150) = NULL

    @AFETADADANOCOBERTODESCRICAO VARCHAR(200) = NULL

    @RECOMENDANIVELGARANTIADESCRICAO VARCHAR(200) = NULL

    @QUEDAPRODUCAODESCRICAO VARCHAR(200) = NULL

    @CONSIDERACOESSOBRERISCOS VARCHAR(3000) = NULL

     

    Se o tamanho destes campos está correto, então eles deveriam ser Text com um uso adequado do TextInRow onde possível e necessário.

     

    @LOCALDATASEGURADO DATETIME = NULL

    @LOCALDATAINSPETOR DATETIME = NULL

     

    Acho que esses campos poderiam ser smallDateTime, apesar de que, pelo nome e pelos outros campos em volta, fico com a ligeira impressão de que não deveriam nem existir.

     

    @NOMEINSPETOR VARCHAR(80) = NULL

     

    Por que duas vezes o nome do inspetor ?

    @CREA VARCHAR(15) = NULL

     

    Você já tem o código do inspetor. o CREA deveria estar em uma tabela de inspetores.

     

    @ASSINATURAINSPETOR VARCHAR(80) = NULL

     

    Você já tem o código do inspetor e tem até o nome dele (o que não devia) 2 vezes (menos ainda), então o que é isso de assinatura do inspetor ? Acredito que você não esteja lidando com um sistema de caneta e escrita em tela em que o inspetor vá assinar na tela de um Tablet com sua letra normal, mas se fosse esse o caso varchar(80) não resolveria...

     

    []'s

     

    Meu Blog : http://blog.dennestorres.com.br 

    quinta-feira, 18 de outubro de 2007 05:50
  • Ehhh amigo, esse foi um projeto que começou com umas implementações que deram erradas, já existem formularios que utilizam esse conceito, mas pede para o usuario reduzir o texto quando estoura o erro.

    A ideia era não precisar disso, por isso os insert e depois update...

     

     

    E algumas coisas podem parecer repeteco, mas e que o formulario e preenchido por reflexão....

     

     

    Abraços...

    quinta-feira, 18 de outubro de 2007 10:42