SQLCMD komutu aksan ekleyemiyor


19

Komut satırından yeni bir veritabanı kurmak için sqlcmd.exe çalıştırmaya çalışıyorum . Windows 7 64 bitlerinde SQL SERVER Express 2012 kullanıyorum.

İşte kullandığım komut:

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

Ve işte sql dosyası oluşturma komut dosyasının bir parçası:

    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'

Lütfen kelimelerin üzerinde bazı aksanların olup olmadığını kontrol edin; tablonun açıklaması. Veritabanı sorunsuz oluşturulur. Ekteki ekran görüntüsünde görebileceğiniz gibi 'Harmanla' komut dosyası tarafından anlaşılır. Buna rağmen, tablo incelenirken aksanlar düzgün şekilde gösterilmiyor.Harmanlama sorunu

Gerçekten herhangi bir yardımı takdir ediyorum. Çok teşekkür ederim.

[Düzenle]: Merhabalar. Notepad ++ kullanarak SQL dosya kodlamasını değiştirmek iyi çalıştı! Yardımın için çok teşekkür ederim: Bu sorunla ilgili ilginç bir şey öğrendim!

resim açıklamasını buraya girin


1
SQL komut dosyanızın kodlaması nedir?
Pondlife

@ Pondlife'ın fikriyle giderdim. Bir metin düzenleyici (Notepad ++ gibi) alın, .sql dosyasını orada açın, Kodlama'ya gidin ve dosyanızın ANSI'de (veya desteklenmeyen başka bir kodlamada) olmadığına bakın. Öyleyse, dosyayı başka bir şeye dönüştürmeyi seçin. UTF8'in yapması gerektiğini söyleyebilirim. Nasıl gittiğini bize bildirin.
Marian

Yanıtlar:


8

Yorumlardan olduğu gibi, sorun tam olarak tablo veya SQLCMD'nin özel karakterleri içe aktarma şekliyle ilgili değildir. Genellikle, sorunlu içe aktarmalar komut dosyasının kendisinin biçimiyle ilişkilidir.

Management Studio'nun kendisi, gelecekte sorunu çözmesi gereken belirli bir kodlama ile kaydetme seçeneği sunar. Bir dosyayı ilk kez kaydederken (veya farklı kaydet seçeneğini kullandığınızda) Kodlama ile kaydet seçeneğini kullanmak için Kaydet düğmesinin yanındaki küçük oku tıklamanız gerekir .

resim açıklamasını buraya girin

Varsayılan olarak dosyayı Batı Avrupa'ya (1252) kaydeder . Herhangi bir özel karakterim olduğunda UTF8 kullanıyorum (belki de başka bir kısıtlayıcı kodlama uygun olabilir) çünkü genellikle en hızlı düzeltme.

resim açıklamasını buraya girin

SSMS kullandığınızdan (resimden) emin değilim, bu yüzden lütfen kendi düzenleyicinizin dosyayı farklı bir kodlamaya kaydetme seçeneğine sahip olduğundan emin olun. Değilse, dosyayı akıllı bir düzenleyicide dönüştürmek (Notepad ++ uygulamasında zaten denediğiniz gibi) genellikle çalışır. Ancak, geniş bir kodlamadan daha dar olana ve daha sonra geniş bir kodlamaya dönüştürüyorsanız (örneğin: Unicode'dan ANSI'ye ve tekrar Unicode'a) bu işe yaramayabilir.


Merhaba Marian. Tekrar teşekkürler. Navicat 'Veri Aktarımı' özelliğini kullandım, çünkü sql betiğini oluşturma şeklini seviyorum (hızlı, mdf dosyasından bağımsız ve şu andan beri her zaman benim için çalışmıştı). Navicat'ın 'Veri Aktarımı' özelliğinde bazı parametreleri kontrol ettim, ancak çıktı dosyası kodlamasını değiştirmenin bir yolunu bulamadım. Kodlamayı değiştirmek için Notepad ++ kullanarak bazı ekstra işler yapmam gerekecek, ancak bu önemli değil.
Oskytar

Peki, mesele yok o zaman. Bununla birlikte, genellikle, bu sitede teşekkürler, cevap faydalıysa, Upvote özelliği (cevabın yanındaki yukarı ok) kullanılarak veya sorununuzu tamamen çözerse, cevap olarak işaretle bile (cevabın yanındaki Onay İşareti) kullanılarak teslim edilir. ) :-). Daha fazla bilgiyi SSS bölümünde bulabilirsiniz .
Marian

Son yorumumu düzeltirim: Navicat ile 'Veri Transferi' yürütülürken dosya çıktı kodlamasını seçmek mümkündür.
Oskytar

Harika, şimdi manuel dönüşüm adımını atlayabileceksiniz. Daha da iyi.
Marian

2
Bu cevap doğru değil. UTF-8 Notepad ++ tarafından kaydedilen dosya vardı. SQLCMD.exe karakterleri düzgün aktarmıyor. İçeriği SSMS'ye kopyalarsam iyi çalışır. Gerçek çözüm, swasheck'in param -f 65001 eklemek için verdiği cevaptı.
Tomas Kubes

39

Yeni öğrendiğim başka bir seçenek de sqlcmddokümantasyondan geliyor . Kod sayfasını sqlcmd, dosya kodlamasının kod sayfasıyla eşleşecek şekilde ayarlamanız gerekir . UTF-8 söz konusu olduğunda, kod sayfası 65001'dir, bu nedenle aşağıdakileri istersiniz:

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


1
Bu sadece hayatımı kurtardı, import-csv -encoding UTF8 ile bir CSV dosyasını okumak için powershell betiği yapmak üzereydim bu doğru olsun. Teşekkürler
Spörri

Bu, bir NVARCHAR sütununa fadas (á, é, í, ó, ú) ile İrlandalı metin değerleri eklemek zorunda kaldığımda benim için çalıştı
öğlen ve

Bu doğru cevap
Pitchmatt

2

Bu tür şeyler çok zordur çünkü size söylemeden çok şey yapılır.

Yapacağım ilk şey, dizeyi görüntülemek için sqlcmd kullanmaktır. Cmd.exe penceresinde düzgün görüntüleniyorsa, bu yararlı bir gerçektir. Sonra, convertaslında hangi bayt olduğunu görmek için varbinary dize ing satır seçiyor. Bence CARTOGRAFIA olarak görünecektir 0x636172746f67726166c3ad61aksanlı "i" bayt c3ad, o karakter için UTF-8 kodlaması olan ile temsil edildiği zaman,. Modern İspanyolca sütununda UTF-8 olması iyi değil (Windows 1252). Bu karakter için Windows 1252'deki bayt değeri 237 ondalıktır (onaltılık ED).

Sütun yanlış kodlanmış veriler içeriyorsa, hata nasıl eklendiğine bağlıdır. Belki dize sabitlerindeki baştaki N'yi kaldırmak - N'string'SQL Server'a bir Unicode dizesi oluşturmasını söyler, ancak düz 'string'karakterlerin istemcinin kodlamasını kullandığını gösterir - Unicode yerine Modern İspanyolca ekler.

Sütun doğru şekilde kodlanmış verileri tutarsa, GUI ekranında bir hata bulduğunuzu söyleyebilirim.

Verileri doğru şekilde eklemek için sqlcmd'yi alamıyorsanız (önde gelen N veya değil), Microsoft'a şikayet etmek istersiniz. Bunu yaptığınızda, baytları sütunda saklandığı gibi gösterebilme - kullanarak convert(colname as varbinary)- neyin yanlış gittiğini açıklamak için kritik olacaktır.


Merhaba James, ayrıntılı cevabınız için çok teşekkür ederim. Bazı testler yaptık ve sqlCmd.exe edilir değil sağ dize gösteren. Verilerin nasıl eklendiğiyle ilgili açıkça bir sorundur.
Oskytar

Sql Profiler kullanarak, SQL Server SQl Server GUI istemcisi kullanılırken gönderilen cümleler hata ayıkladı. [ElementType] ([Kod], [Ad], [Açıklama], [GeometryType], [stringId], [CapturedGeometryType]) DEĞERLERİNE EKLE ('ESTACION', 'Estación', 'Estación', 'Multipoint', NULL, 'Nokta'); FINE çalıştı, bu yüzden tüm aksanlar düzgün bir şekilde yerleştirildi !. Bu benim sql betiğimde görünen aynı 'cümle ekle'. Sql kod dosyasındaki karakter kodunu belirtmeli miyim?
Oskytar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.