none
UPDATETEXT dinâmico RRS feed

  • Pergunta

  • Bom dia, amigos.

    Criei um script que busca em todas as tabelas da minha base de dados, por campos do tipo TEXT.
    Quando encontra, verifica se existe valor Y no campo e troca por valor X.

    A questão é que não é possível no Sql Server utilizar variáveis como nome de objetos.
    Por isso preciso utilizar com EXEC o UPDATETEXT e concatenar as variáveis que possuem nome da tabela e coluna.

    Meu problema ocorre quando tento fazer esta concatenção, em função dos tipos de dados.
    Alguém sabe me dizer como posso executar este UPDATETEXT passando variável para definir o objeto?

    O que tente foi assim:
    Code Snippet

    EXEC('UPDATETEXT '+ @tabela +'.'+ @coluna +' '+ @ptr +' '+ @pos +' '+ @txtlen +' '''+ @ntxt +'''')




    E assim, mas este dá erro direto por não aceitar variável no nome do objeto:
    Code Snippet

    UPDATETEXT @tabela.@coluna @ptr @pos @txtlen @ntxt





    Desde já, muito obrigado.
    terça-feira, 29 de julho de 2008 12:50

Respostas

  • Só para deixar este post respondido, consegui fazer o que eu queria.
    Com o auxílio do fn_varbintohexstr, consegui concatenar o binário como hexadecimal no meu script e então funcionou.
    Code Snippet

    DECLARE @tmpHex VARCHAR(4000)
    SET @tmpHex = UPPER(master.dbo.fn_varbintohexstr(@ptr))
    SET @query = 'UPDATETEXT '+ @myTable +'.'+ @myColumn +' '+ @tmpHex +' '+ CAST(@pos AS VARCHAR(100)) +' '+ CAST(@txtlen AS VARCHAR(100)) +' '''+ @ntxt +''''


    Obrigado aos que tentaram me ajudar.
    sexta-feira, 1 de agosto de 2008 19:05

Todas as Respostas

  • Theo,

     

    Veja se este exemplo extraído do Books On-Line ajuda:

     

    USE pubs;
    GO
    
    ALTER DATABASE pubs SET RECOVERY SIMPLE;
    GO
    
    DECLARE @ptrval binary(16)
    SELECT @ptrval = TEXTPTR(pr_info) 
       FROM pub_info pr, publishers p
          WHERE p.pub_id = pr.pub_id 
          AND p.pub_name = 'New Moon Books'
    UPDATETEXT pub_info.pr_info @ptrval 88 1 'b';
    GO
    
    ALTER DATABASE pubs SET RECOVERY FULL;
    GO
     
     
    terça-feira, 29 de julho de 2008 13:00
  • Oi, Junior.

    Não serve, não. Meu problema está ao passar o nome da tabela dinamicamente.

    terça-feira, 29 de julho de 2008 13:09
  • Cara vc. pode fazer o loop veja que o updatext ja recebe variaveis.

     

     

    Abs;

     

    terça-feira, 29 de julho de 2008 13:27
  • Creio que eu não esteja visualizando da mesma forma que vocês.

    No exemplo passado pelo Jr, "pub_info" é o nome do objeto (tabela) e não uma variável.
    Preciso colocar o nome da tabela e da coluna como variável.
    Do contrário meu script seria engessado para algumas tabelas pré-definidas.

    Se estou errado peço, por favor, que me esclareçam melhor.


    Obrigado.
    terça-feira, 29 de julho de 2008 13:34
  • Theo,

     

    Tente assim:

    Code Snippet

     

    Declare @Comando VarChar(500),

    @Tabela Varchar(100),

    @Coluna VarChar(100),

    @ntxt VarChar(100)

     

    Set @Tabela='SuaTable'

    Set @Coluna='SuaColuna'

    Set @Ntxt='Texto'

    Set @Comando='UpdateText '+''''+@tabela+''''+'.'+''''+@coluna+''''+' '+''''+ @ntxt +''''

     

    Print @Comando

     

     

    No lugar do Print utilize Exec(@Comando)

     

     

     

    terça-feira, 29 de julho de 2008 13:56
  • Ocorre que ao concatenar um tipo binário na string, dá erro.
    Estou colando o script inteiro para que vocês possam visualizar melhor meu problema.

    Relembrando, com ele procuro em todas as tabelas os campos do tipo CHAR, VARCHAR e TEXT por um determinado texto e substituo por outro.
    Campos CHAR e VARCHAR está funcionando. O problema está no TEXT.


    Grato.

    Code Snippet

    DECLARE @dadoProcurar VARCHAR(150), @dadoTrocar VARCHAR(150)

    SET @dadoProcurar = 'texto a procurar'
    SET @dadoTrocar = 'texto para substituir'

    DECLARE @tabela VARCHAR(150), @coluna VARCHAR(150), @tipoDado INT
    DECLARE lista CURSOR FOR
        SELECT
             o.name AS tabela
            ,c.name AS coluna
            ,c.xtype AS tipoDado
        FROM
            sysobjects o
        INNER JOIN
            syscolumns c ON o.id = c.id
        WHERE
            o.xtype='U'
            AND
            o.name <> 'dtproperties'
            AND
            c.xtype IN (167, 175, 35)


    OPEN lista
    FETCH NEXT FROM lista INTO @tabela, @coluna, @tipoDado

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @tipoDado <> 35
            EXEC('UPDATE '+ @tabela +' SET '+ @coluna +' = REPLACE('+ @coluna +', '''+ @dadoProcurar +''', '''+ @dadoTrocar +''')')
        ELSE
        BEGIN
            SELECT @tabela, @coluna, @tipoDado
            DECLARE @otxt VARCHAR(1000)
            SET @otxt = @dadoProcurar

            DECLARE @ptr BINARY(16)
            DECLARE @pos INT
            DECLARE @query NVARCHAR(1000), @mainCursor CURSOR

            SET @query = 'SET @cursor = CURSOR FOR
                    SELECT
                         textptr('+ @coluna +') AS ptr
                        ,charindex('''+ @otxt +''', '+ @coluna +')-1 AS pos
                    FROM
                        '+ @tabela +'
                    WHERE
                        '+ @coluna +' LIKE ''%' + @otxt +'%''
                      OPEN @cursor'
            EXEC sp_executesql @query, N'@cursor CURSOR OUTPUT', @mainCursor OUTPUT
            FETCH NEXT FROM @maincursor INTO @ptr, @pos


            DECLARE @ntxt VARCHAR(1000)
            SET @ntxt = @dadoTrocar

            DECLARE @txtlen INT
            SET @txtlen = LEN(@otxt)

            WHILE @@FETCH_STATUS = 0
            BEGIN   
                UPDATETEXT [@tabela].[@coluna] @ptr @pos @txtlen @ntxt


                --EXEC('UPDATETEXT '+ @tabela +'.'+ @coluna +' '+ @ptr +' '+ @pos +' '+ @txtlen +' '''+ @ntxt +'''')

                FETCH NEXT FROM @maincursor INTO @ptr, @pos   
            END

            CLOSE @maincursor
            DEALLOCATE @maincursor
        END

        FETCH NEXT FROM lista INTO @tabela, @coluna, @tipoDado
    END

    CLOSE lista
    DEALLOCATE lista

    terça-feira, 29 de julho de 2008 18:27
  • Só para deixar este post respondido, consegui fazer o que eu queria.
    Com o auxílio do fn_varbintohexstr, consegui concatenar o binário como hexadecimal no meu script e então funcionou.
    Code Snippet

    DECLARE @tmpHex VARCHAR(4000)
    SET @tmpHex = UPPER(master.dbo.fn_varbintohexstr(@ptr))
    SET @query = 'UPDATETEXT '+ @myTable +'.'+ @myColumn +' '+ @tmpHex +' '+ CAST(@pos AS VARCHAR(100)) +' '+ CAST(@txtlen AS VARCHAR(100)) +' '''+ @ntxt +''''


    Obrigado aos que tentaram me ajudar.
    sexta-feira, 1 de agosto de 2008 19:05