Usuário com melhor resposta
UPDATETEXT dinâmico

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 SnippetEXEC('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 SnippetUPDATETEXT @tabela.@coluna @ptr @pos @txtlen @ntxt
Desde já, muito obrigado.
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 SnippetDECLARE @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.
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
-
-
-
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. -
Theo,
Tente assim:
Code SnippetDeclare
@Comando VarChar(500),@Tabela Varchar
@Coluna VarChar
(100),@ntxt VarChar
(100)Set
@Tabela='SuaTable'Set
@Coluna='SuaColuna'Set
@Ntxt='Texto'Set
@Comando='UpdateText '+''''+@tabela+''''+'.'+''''+@coluna+''''+' '+''''+ @ntxt +''''Print
@ComandoNo lugar do Print utilize Exec(@Comando)
-
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 -
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 SnippetDECLARE @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.