none
Retorno de um exec para uma variavel RRS feed

  • Pergunta

  • Ola pessoal , tenho uma duvida

    Montei um script para jogar em uma trigger que deve buscar todos os campos da tabela e grava-los concatenados com um caracter de separação (tipo um '|' p.e.) .

    Olhei os posts colocados no forum e com base neles consegui montar o seguinte script.

    Declare @Campos varchar(4000)
    Declare @Campos_Temp varchar(4000)
    Declare @Tabela varchar(50)
    Declare @select varchar(4000)
    Declare @Tabela_Campos Table(Codigo int,Campo varchar(100))
    Declare @Nro_Registros int,
                   @Reg_Atual int,
                    @Campo_Temp varchar(1000)
    Set @Reg_Atual = 1
    Set @Campo_Temp = ''
    Set @Campos = ''
    Set @select = ''

    INSERT INTO @Tabela_Campos SELECT syscolumns.colid,syscolumns.name FROM syscolumns Inner Join sysobjects ON sysobjects.id = OBJECT_ID(@tabela)
    AND sysobjects.id=syscolumns.id Order by syscolumns.colorder

    Select @Nro_Registros = Count(*) from @Tabela_Campos
    While @Reg_Atual <= @Nro_Registros
    Begin
       Select @select = 'select '+(COL_NAME(OBJECT_ID(
    @tabela),@Reg_Atual))+' from '+@tabela+' where R_E_C_N_O_ = 2'
       exec(@select) -- >> aqui imprime o conteudo do campo
       
    Set @Campos = @Campos + '|' + exec(@select) -- > Aqui estou tentando concatenar os resultados e nao consigo.
       Set @Reg_Atual = @Reg_Atual + 1
       PRINT @Campos
    end

    Porem não consigo fazer a concatenação dos campos em uma varivel para poder utilizar isso mais a frente no script. (da erro de sintaxe por atribuir o exec à variavel)

    Tentei montar o @select concatenando tambem , mas não sei como fazer ele interpretar o " ' " (aspas simples) com caracter e nao divisor de campo.

    Se alguem souber como fazer isso , agradeço!!!!

    Mauricio

    quinta-feira, 15 de fevereiro de 2007 12:05

Respostas

Todas as Respostas

  • Bom dia Maurício, tenta assim:

     

    Declare @Campos varchar(4000)
    Declare @Campos_Temp varchar(4000)
    Declare @Tabela varchar(50)
    Declare @select varchar(4000)
    Declare @Tabela_Campos Table(Codigo int,Campo varchar(100))
    Declare @Nro_Registros int,
                   @Reg_Atual int,
                    @Campo_Temp varchar(1000)
    Set @Reg_Atual = 1
    Set @Campo_Temp = ''
    Set @Campos = ''
    Set @select = ''

    INSERT INTO @Tabela_Campos SELECT syscolumns.colid,syscolumns.name FROM syscolumns Inner Join sysobjects ON sysobjects.id = OBJECT_ID(@tabela)
    AND sysobjects.id=syscolumns.id Order by syscolumns.colorder

    Select @Nro_Registros = Count(*) from @Tabela_Campos
    While @Reg_Atual <= @Nro_Registros
    Begin
       Select @select = (COL_NAME(OBJECT_ID(@tabela),@Reg_Atual))
       exec(@select) -- >> aqui imprime o conteudo do campo
       Set @Campos = @Campos + '|' + @select -- > Aqui estou tentando concatenar os resultados e nao consigo.
       Set @Reg_Atual = @Reg_Atual + 1
       PRINT @Campos
    end

    Espero ter ajudado

    quinta-feira, 15 de fevereiro de 2007 12:44
  • vc. pode usar a sp_executesql com um output de paramatro +- assim

     

    exec sp_executesql @TSql, N'@Retorno Numeric(10,2) OUTPUT', @Retorno  OUTPUT

     

    Abs;

    quinta-feira, 15 de fevereiro de 2007 13:27
  • Marcelo

       Montei assim o script conforme vc indicou

          Select @select = 'select top 1 '+(COL_NAME(OBJECT_ID(@Tabela),@Reg_Atual))+' Campo from '+(@Tabela)   
          exec sp_executesql @select, N'@Retorno varchar(4000) OUTPUT', @Retorno  OUTPUT
          select @Campos_Temp = @Retorno
          print @Campo_Temp

       Mas da o seguinte erro ==>

    Server: Msg 214, Level 16, State 2, Procedure sp_executesql, Line 31
    Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

    Oq pode ser isso?

     

    quinta-feira, 15 de fevereiro de 2007 16:23
  • Olá Mauricio,

    Sua variável @select deve ser do tipo nvarchar()!!

    Veja um exemplo:

    DECLARE @sql nvarchar(2000)
    -- Verifica se a tabela existe
    SET @sql = 'SELECT @tableid=id FROM '+ @dbname +'..sysobjects WHERE xtype=''U'' AND name=''' + @tbname + ''''
    exec sp_executesql @sql, N'@tableid int OUTPUT', @tableid OUTPUT

    IF @tableid is null
     begin
              --A tabela não existe
              SET @status= 2
              RETURN @status
     end

    um abraço
    Nilton Pinheiro
    www.mcdbabrasil.com.br

    quinta-feira, 15 de fevereiro de 2007 17:08
  • Nilton

       Realmente com nvarchar funciona, porem, não retornou nada no sq_exec.

     Declare @Campos varchar(4000)
     Declare @Campos_Temp varchar(4000)
     Declare @select nvarchar(4000)
     Declare @Tabela varchar(20)
     Declare @Nro_Registros int,
                   @Reg_Atual int,
                    @Campo_Temp varchar(1000)
     Declare @Retorno varchar(400)
     Set @Reg_Atual = 1
     Set @Campo_Temp = ''
     Set @Campos = ''
     Set @Tabela = 'SA6010'

     SELECT @Nro_Registros = Count(*) FROM syscolumns Inner Join sysobjects ON sysobjects.id = OBJECT_ID(@Tabela)
     AND sysobjects.id=syscolumns.id

     While @Reg_Atual <= @Nro_Registros
     Begin
       Select @select = 'select top 1 '+(COL_NAME(OBJECT_ID(@Tabela),@Reg_Atual))+' Campo from '+(@Tabela)   
       exec sp_executesql @select,
    N'@Retorno nvarchar(4000) OUTPUT', @Retorno  OUTPUT
       print 'Retorno ==>' + @Retorno
       select @Campos_Temp = @Retorno
       print @Campo_Temp

       IF @Campos_Temp = ' '
         begin
          Set @Campos = @Campos + '|'
         end
       ELSE
         begin
          Set @Campos = @Campos + '|' + LTRIM(RTRIM(@Campos_Temp))
         end
      end

    A consulta funciona pois os campos são mostrados no grid do Query Analizer, porem não sao atriubuidos a variavel @Retorno. no print nao mostra nada.

    quinta-feira, 15 de fevereiro de 2007 17:33
  • Observe bem os lugares onde a variável @tableid do exemplo que lhe passei aparece!!

    um abraço
    Nilton Pinheiro
    www.mcdbabrasil.com.br

     

     

    quinta-feira, 15 de fevereiro de 2007 22:50