Il comando SQLCMD non è in grado di inserire accenti


19

Sto cercando di eseguire sqlcmd.exe per configurare un nuovo database dalla riga di comando. Sto usando SQL SERVER Express 2012 su Windows 7 64 bit.

Ecco il comando che uso:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 

Ed ecco un pezzo dello script di creazione del file sql:

    CREATE DATABASE aqualogy 
    COLLATE Modern_Spanish_CI_AS
    WITH TRUSTWORTHY ON, DB_CHAINING ON;
    GO
    use aqualogy
    GO
    CREATE TABLE [dbo].[BaseLayers] (
    [Code] nchar(100) NOT NULL ,
    [Geometry] nvarchar(MAX) NOT NULL ,
    [IsActive] bit NOT NULL DEFAULT ((1)) 
    )

    EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de     cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)'
, @level0type = 'SCHEMA', @level0name = N'dbo'
, @level1type = 'TABLE', @level1name = N'BaseLayers'

Bene, per favore controlla che ci siano alcuni accenti sulle parole; quale è la descrizione della tabella. Il database viene creato senza problemi. 'Fascicola' è compreso dallo script, come puoi vedere nello screenshot allegato. Nonostante ciò, gli accenti non vengono mostrati correttamente quando si esamina il tavolo.Problema di confronto

Gradirei davvero qualsiasi aiuto. Grazie mille.

[Modifica]: Ciao a tutti. La modifica della codifica del file SQL tramite Notepad ++ ha funzionato correttamente! Grazie mille per l'aiuto: ho imparato qualcosa di interessante con questo problema!

inserisci qui la descrizione dell'immagine


1
Qual è la codifica del tuo file di script SQL?
Pondlife,

Vorrei andare con l'idea di @ Pondlife. Prendi un editor di testo (come Notepad ++), apri il file .sql lì, vai su Codifica e vedi che il tuo file non è in ANSI (o qualche altra codifica non supportata). Se lo è, scegli di convertire il file in qualcos'altro. Direi che UTF8 dovrebbe farlo. Fateci sapere come è andata.
Marian,

Risposte:


8

A partire dai commenti, il problema non è esattamente con la tabella o il modo in cui SQLCMD importa i caratteri speciali. Di solito, le importazioni problematiche sono correlate al formato dello script stesso.

Management Studio stesso offre la possibilità di salvare con una codifica specifica, che dovrebbe risolvere il problema in futuro. Quando si salva un file per la prima volta (o si utilizza Salva con nome), è necessario fare clic sulla piccola freccia vicino al pulsante Salva , per utilizzare l'opzione Salva con codifica .

inserisci qui la descrizione dell'immagine

Di default salva il file in Europa occidentale (1252) . Ogni volta che ho caratteri speciali uso UTF8 (anche se forse qualche altra codifica restrittiva si adatterebbe) perché di solito è la soluzione più veloce.

inserisci qui la descrizione dell'immagine

Non sono sicuro (dall'immagine) che stai usando SSMS, quindi assicurati che il tuo editor abbia l'opzione di salvare il file con una codifica diversa. In caso contrario, la conversione del file in un editor intelligente (come hai già provato in Notepad ++) di solito funziona. Tuttavia, potrebbe non funzionare se stai convertendo da una codifica ampia a una più stretta e poi di nuovo a una più ampia (ad esempio: da Unicode a ANSI e di nuovo a Unicode).


Ciao marian Grazie ancora. Ho usato la funzione 'Data Transfer' di Navicat, perché mi piace il modo in cui genera lo script sql (veloce, indipendente da file mdf e da allora ha sempre funzionato per me). Ho controllato alcuni parametri nella funzione "Trasferimento dati" su Navicat, ma non ho trovato alcun modo per modificare la codifica del file di output. Dovrò fare qualche lavoro extra usando Notepad ++ per cambiare la codifica, ma non è un grosso problema.
Oskytar il

Bene, nessun problema. Tuttavia, di solito, grazie a questo sito vengono forniti utilizzando la funzione Upvote (la freccia rivolta verso l'alto vicino alla risposta) se la risposta è utile o, se risolve completamente il problema, anche usando il segno come risposta (il segno di spunta vicino alla risposta ) :-). Vedi di più qui, nelle FAQ .
Marian,

Correggo il mio ultimo commento: È possibile scegliere la codifica di output del file quando si esegue "Trasferimento dati" con Navicat.
Oskytar il

Bene, quindi ora sarai in grado di bypassare il passaggio di conversione manuale. È anche meglio.
Marian,

2
Questa risposta sembra non essere corretta. Ho avuto il file salvato da Notepad ++ in UTF-8. SQLCMD.exe non trasferisce i caratteri correttamente. Se copio il contenuto su SSMS, funziona perfettamente. La vera soluzione era la risposta fornita da Swasheck per aggiungere il parametro -f 65001.
Tomas Kubes,

39

Un'altra opzione, quella che ho appena appreso, viene dalla sqlcmddocumentazione . È necessario impostare la codepage sqlcmdaffinché corrisponda a quella della codifica del file. Nel caso di UTF-8, la tabella codici è 65001, quindi vorresti:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001


1
Questo mi ha appena salvato la vita, stavo per fare uno script PowerShell per leggere un file CSV con codifica UTF8 import-csv per ottenere questo corretto. Grazie
Spörri

Questo ha funzionato per me quando ho dovuto inserire valori di testo irlandesi con fadas (á, é, í, ó, ú) in una colonna NVARCHAR
mezzogiorno e

Questa è la risposta corretta
Pitchmatt

2

Questo genere di cose è molto complicato perché si fa così tanto senza dirtelo.

La prima cosa che vorrei fare è usare sqlcmd per visualizzare la stringa. Se viene visualizzato correttamente nella finestra di cmd.exe, questo è un dato utile. Quindi, selezionerei la riga convertdella stringa su varbinary per vedere quali byte sono effettivamente lì. Penso che cartografía apparirà come 0x636172746f67726166c3ad61, dove l'accento "i" è rappresentato dai byte c3ad, che è la codifica UTF-8 per quel personaggio. Non va bene avere UTF-8 in una colonna spagnola moderna (Windows 1252). Il valore di byte in Windows 1252 per quel carattere è 237 decimale (ED esadecimale).

Se la colonna contiene dati non codificati, l'errore risiede nel modo in cui sono stati inseriti. Forse rimuovendo la N iniziale nelle costanti di stringa - N'string'dice a SQL Server di generare una stringa Unicode, ma semplice 'string'indica che i caratteri usano la codifica del client - inserirà lo spagnolo moderno invece di Unicode.

Se la colonna contiene dati correttamente codificati, direi che hai trovato un bug nella visualizzazione della GUI.

Se non riesci a ottenere sqlcmd per inserire correttamente i dati (portando N o meno), allora vuoi lamentarti con Microsoft. Quando lo fai, essere in grado di mostrare i byte memorizzati nella colonna - usando convert(colname as varbinary)- sarà fondamentale per spiegare cosa non va.


Ciao James, grazie mille per la tua risposta dettagliata. Ho fatto alcuni test e Sqlcmd.exe non mostra la stringa corretta. È chiaramente un problema su come vengono inseriti i dati.
Oskytar il

Utilizzando Sql Profiler, ho eseguito il debug di quali frasi sono state inviate a SQL SERVER quando si utilizzava il client GUI del server SQl. INSERISCI IN [ElementType] ([Code], [Name], [Description], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ('ESTACION', 'Estación', 'Estación', 'Multipoint', NULL, 'Punto'); ha funzionato FINE, quindi tutti gli accenti sono stati correttamente inseriti !. Questa è la stessa "frase di inserimento" che appare nel mio script sql. Devo specificare il codice carattere nel file di script sql?
Oskytar il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.