none
Insert e update para atualizar tabela no SQL server. RRS feed

  • Pergunta

  • Galera,

    Estou com dificuldades no SQL server ( Stored procedure )

    Preciso verificar se existe tabela resposta se jpa existir fazer um update(atualizar esse tabela)

    Se não existir inserir tabela.

    Tentei fazer, porem nao sei se a sintaxe esta correta pois não esta rodando.

    USE [Northwind]
    GO
    /****** Object:  StoredProcedure [dbo].[spInsertResposta]    Script Date: 03/15/2012 09:30:55 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[spInsertResposta]
       	@id_pergunta int,
    	@id_formulario int,
    	@id_planoAcao int = null,
    	@Valor int,
    	@id_responsavel int
    	
    as
    declare @id_resposta int	
    if @id_planoAcao =0 set @id_planoAcao = null
    select @id_resposta=isnull(max(id_resposta)+1,1) from resposta
    if (select * from resposta where id_resposta= @id_resposta)
    	begin
    		update resposta set id_resposta=@id_resposta,id_pergunta=@id_pergunta,id_formulario=@id_formulario, Id_planoAcao=@Id_planoAcao, valor=@valor,Id_responsavel=@Id_responsavel
    	end
    else
    	begin
    		insert into resposta (id_resposta,id_pergunta,id_formulario, Id_planoAcao, valor, Data, Id_responsavel)
    		values (@id_resposta,@id_pergunta,@id_formulario,@Id_planoAcao,@valor,getDate(),@Id_responsavel)
    	end

    quinta-feira, 15 de março de 2012 13:36

Respostas

  • Olá Raquel,

    Você só precisa verificar se uma determinada tabela existe? Nós podemos usar o operador EXISTS. Segue um exemplo:

    IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE name = 'TESTE') BEGIN
    	PRINT ('JA EXISTE')
    	DROP TABLE TESTE
    END
    ELSE BEGIN
    	CREATE TABLE TESTE(
    	ID INT
    )
    PRINT ('TABELA CRIADA')
    END
    

    Este operador poderá ser usado com indexes, procedures, functions etc.

    Você precisará apenas conhecer as dmv's corretas, por exemplo:

    SYS.OBJECTS, SYS.INDEXES, SYS.PROCEDURES etc...

    abraços.

    Se útil, Classifique.


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com é de SP e Vai ao SQL Saturday #127?

    quinta-feira, 15 de março de 2012 13:48

Todas as Respostas

  • Olá Raquel,

    Você só precisa verificar se uma determinada tabela existe? Nós podemos usar o operador EXISTS. Segue um exemplo:

    IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE name = 'TESTE') BEGIN
    	PRINT ('JA EXISTE')
    	DROP TABLE TESTE
    END
    ELSE BEGIN
    	CREATE TABLE TESTE(
    	ID INT
    )
    PRINT ('TABELA CRIADA')
    END
    

    Este operador poderá ser usado com indexes, procedures, functions etc.

    Você precisará apenas conhecer as dmv's corretas, por exemplo:

    SYS.OBJECTS, SYS.INDEXES, SYS.PROCEDURES etc...

    abraços.

    Se útil, Classifique.


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com é de SP e Vai ao SQL Saturday #127?

    quinta-feira, 15 de março de 2012 13:48
  • Raquel, bom dia.

    O problema está no if.

    if (select * from resposta where id_resposta= @id_resposta)
    


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quinta-feira, 15 de março de 2012 13:51
  • O if está aguardando um resultado booleano.

    Por favor, analise a regra de negócio para a comparação deste if. Se tiver dificuldades na sintaxe, coloque a regra de negócio em um novo post que te auxilio no código.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quinta-feira, 15 de março de 2012 13:54
  • Raquel boa tarde

    Pela lógica da sua procedure, ela sempre executará um insert pois vc está sempre lendo o maior valor de id_resposta e incrementando. E caso voce a sua proc fizesse upadte e insert, o Eduardo está correto pois vc deveria usar a clasula EXISTS junto com o seu select

    if Exists  (select * from resposta where id_resposta= @id_resposta)
    ...

    []

    quinta-feira, 15 de março de 2012 18:05
  • Raquel,

    Uma observação, você realmente precisa fazer um Select * neste comando IF?

    Se deseja fazer uma análise não seria o caso somente de utilizando neste campo condicional uma única coluna ao invês do asterisco?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 15 de março de 2012 18:09
  • Bom Dia,

    Não seria o caso de usar o MERGE ?

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    sexta-feira, 16 de março de 2012 12:42