Eu tenho uma tabela legada com um nome contendo caracteres não imprimíveis ( CHAR(31)
, para ser específico).
O caractere não imprimível está ao lado de um sublinhado e descobri que o atalho CTRL+SHIFT+_cria o CHAR(31)
caractere (que significa "EUA" - separador de unidades). O desenvolvedor anterior pode ter acertado essa combinação por engano e criado a tabela com esse personagem estranho.
Quando emitimos um SELECT
comando na tabela, ele retorna resultados. Mas quando tentamos emitir qualquer DDL contra ele ( DROP
, sp_rename
, etc), o personagem causa um problema.
Exemplos:
DROP TABLE Table_Name;
Levanta:
Msg 15225 - Nenhum item com o nome de 'Table_Name' pôde ser encontrado no banco de dados atual 'MyDB', dado que @itemtype foi inserido como '(nulo)'.
EXEC sp_rename N'Table_Name', N'NewTableName';
Levanta:
Msg 102 - Sintaxe incorreta perto de '_Name'.
Já dupliquei a tabela com o nome correto, e corrigi nos objetos dependentes. A etapa restante é apenas removê-lo do banco de dados.
Só um insight: quando copiamos+colamos do SQL Server para o Notepad++, ele mostra o caractere oculto ("US") no meio do nome da tabela, ao lado do sublinhado:
Como você já sabe qual caractere está oculto, pode facilmente construir o nome atual usando uma variável, passá-la para
sp_rename
e, em seguida, descartar a tabela usando o nome recém-adquirido:(Sempre tenha cuidado ao usar o identificador de esquema adequado .)
Ainda mais fácil seria pegar sua string que você sabe que contém o caractere e envolvê-la entre colchetes. Isso funcionou para mim muito bem:
Se você não conhece o(s) caractere(s) problemático(s), pode extrair o nome da exibição do catálogo, identificando-o pelos caracteres ao redor e, em seguida, percorrer os caracteres para determinar quais são problemáticos. Aqui está uma reprodução completa:
Resultados:
E então não se esqueça de repreender ou bater na pessoa responsável por uma mesa que entrou no sistema dessa maneira em primeiro lugar, se ela ainda estiver empregada na indústria.
Acabei de tentar criar e descartar uma tabela usando o bloco de notas para inserir o comando. Funcionou bem para mim (Server 2012 R2, SQL Server 2014).
No bloco de notas, digitei
Some<Ctrl+Shift+_>_Table
Selecionei todo esse texto, copiei e colei na instrução create table e drop table no SSMS. No SSMS, pude ver que o caractere não imprimível estava lá, porque usar as teclas de seta fazia uma pausa no sublinhado.
DROP TABLE dbo.[<Ctrl+V>] ;
Como alternativa, você pode consultar a
sys.objects
exibição de gerenciamento e localizar o ID do objeto da tabela. Use isso para gerar uma instrução SQL dinâmica. Copie o ID do objeto dossys.objects
resultados e cole-o no SQL dinâmico.