AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 115652
Accepted
Thiago Anitelle
Thiago Anitelle
Asked: 2015-09-22 06:50:47 +0800 CST2015-09-22 06:50:47 +0800 CST 2015-09-22 06:50:47 +0800 CST

Descartando uma tabela com um caractere não imprimível em seu nome [duplicado]

  • 772
Esta pergunta já tem respostas aqui :
Escapando palavras-chave T-SQL (2 respostas)
Fechado há 4 anos .

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 SELECTcomando 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:

Caractere separador de unidades (CHAR(31))

sql-server sql-server-2008
  • 2 2 respostas
  • 1413 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2015-09-22T06:53:35+08:002015-09-22T06:53:35+08:00

    Como você já sabe qual caractere está oculto, pode facilmente construir o nome atual usando uma variável, passá-la para sp_renamee, em seguida, descartar a tabela usando o nome recém-adquirido:

    DECLARE @t nvarchar(128) = N'dbo.Table' + NCHAR(31) + N'_Name';
    EXEC sys.sp_rename @t, N'NewTableName', N'OBJECT';
    DROP TABLE dbo.NewTableName;
    

    (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:

    DROP TABLE dbo.[Table_Name];
    ---------------------^
    -- There is an NCHAR(31) right before the underscore
    

    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:

    USE tempdb;
    GO
    
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = N'CREATE TABLE dbo.[Table' + NCHAR(31) + N'_Name](ID INT);';
    EXEC sys.sp_executesql @sql;
    GO
    
    DECLARE @var NVARCHAR(128);
    SELECT @var = name 
      FROM sys.tables 
      WHERE name LIKE N'Table%Name';
    
    -- is it the right one?
    PRINT @var;
    
    DECLARE @i INT;
    SET @i = 1;
    WHILE @i <= LEN(@var)
    BEGIN
      PRINT SUBSTRING(@var, @i, 1) + N' => ' + RTRIM(UNICODE(SUBSTRING(@var, @i, 1)));
      SET @i = @i + 1;
    END
    

    Resultados:

    Table_Name
    T => 84
    a => 97
    b => 98
    l => 108
    e => 101
     => 31
    _ => 95
    N => 78
    a => 97
    m => 109
    e => 101
    

    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.

    • 19
  2. Greenstone Walker
    2015-09-22T20:49:24+08:002015-09-22T20:49:24+08:00

    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.objectsexibiçã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 dos sys.objectsresultados e cole-o no SQL dinâmico.

    SELECT name, object_id  FROM sys.objects WHERE type = 'U' ;
    
    DECLARE @Statement nvarchar(1000) ;
    SET @Statement = 'DROP TABLE [' + object_schema_name(1109578991) + '].[' + object_name(1109578991) + '] ;'
    SELECT @Statement ;
    EXEC (@Statement) ;
    
    • 1

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve