คำสั่ง SQLCMD ไม่สามารถแทรกเครื่องหมายเน้นเสียงได้


19

ฉันพยายามเรียกใช้sqlcmd.exeเพื่อตั้งค่าฐานข้อมูลใหม่จากบรรทัดคำสั่ง ฉันใช้ SQL SERVER Express 2012 บน Windows 7 64 บิต

นี่คือคำสั่งที่ฉันใช้:

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

และนี่คือสคริปต์สร้างไฟล์ 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'

โปรดตรวจสอบว่ามีสำเนียงบางอย่างในคำนั้น; ซึ่งเป็นคำอธิบายของตาราง ฐานข้อมูลถูกสร้างขึ้นโดยไม่มีปัญหา สคริปต์จะเข้าใจ 'การตรวจทาน' อย่างที่คุณเห็นในภาพหน้าจอที่แนบมา แม้จะมีสิ่งนี้สำเนียงจะไม่แสดงอย่างถูกต้องเมื่อตรวจสอบตารางปัญหาการเรียงหน้า

ฉันขอขอบคุณความช่วยเหลือใด ๆ ขอบคุณมาก.

[แก้ไข]: สวัสดีทุกคน การเปลี่ยนการเข้ารหัสไฟล์ SQL โดยใช้ Notepad ++ ทำงานได้ดี! ขอบคุณมากสำหรับความช่วยเหลือ: ฉันได้เรียนรู้สิ่งที่น่าสนใจเกี่ยวกับปัญหานี้!

ป้อนคำอธิบายรูปภาพที่นี่


1
การเข้ารหัสไฟล์สคริปต์ SQL ของคุณคืออะไร?
Pondlife

ฉันจะไปกับความคิดของ @ Pondlife หยิบเครื่องมือแก้ไขข้อความ (เช่นแผ่นจดบันทึก ++) เปิดไฟล์. sql ที่นั่นไปที่การเข้ารหัสและดูว่าไฟล์ของคุณไม่ได้อยู่ใน ANSI (หรือการเข้ารหัสอื่น ๆ ที่ไม่รองรับ) ถ้าเป็นเช่นนั้นเลือกที่จะแปลงไฟล์เป็นอย่างอื่น ฉันว่า UTF8 ควรจะทำ แจ้งให้เราทราบว่ามันไปอย่างไร
แมเรียน

คำตอบ:


8

จากความคิดเห็นปัญหาไม่ตรงกับตารางหรือวิธี SQLCMD นำเข้าอักขระพิเศษ โดยปกติการนำเข้าที่มีปัญหาจะเกี่ยวข้องกับรูปแบบของสคริปต์เอง

Management Studio เสนอทางเลือกในการบันทึกด้วยการเข้ารหัสเฉพาะซึ่งควรแก้ไขปัญหาในอนาคต เมื่อบันทึกไฟล์เป็นครั้งแรก (หรือใช้บันทึกเป็น) คุณควรคลิกที่ลูกศรเล็ก ๆ ใกล้บันทึกปุ่มที่จะใช้ตัวเลือกในการบันทึกด้วยการเข้ารหัส

ป้อนคำอธิบายรูปภาพที่นี่

โดยค่าเริ่มต้นก็จะบันทึกไฟล์ในยุโรปตะวันตก (1252) เมื่อใดก็ตามที่ฉันมีอักขระพิเศษฉันใช้ UTF8 (แม้ว่าการเข้ารหัสที่ จำกัด อื่น ๆ อาจเหมาะสม) เพราะโดยปกติแล้วจะเป็นการแก้ไขที่เร็วที่สุด

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่แน่ใจ (จากรูป) ที่คุณใช้ SSMS ดังนั้นโปรดตรวจสอบให้แน่ใจว่าตัวแก้ไขของคุณมีตัวเลือกในการบันทึกไฟล์ในการเข้ารหัสที่แตกต่างกัน หากไม่มีการแปลงไฟล์ในโปรแกรมแก้ไขแบบสมาร์ท (เช่นที่คุณเคยลองใน Notepad ++) จะใช้งานได้ แม้ว่ามันอาจไม่ทำงานหากคุณแปลงจากการเข้ารหัสแบบกว้างเป็นแบบแคบและจากนั้นกลับเป็นแบบกว้าง (เช่น: จาก Unicode เป็น ANSI และกลับเป็น Unicode)


สวัสดีมาเรียน ขอขอบคุณอีกครั้ง. ฉันใช้ฟีเจอร์ 'Data Transfer' จาก Navicat เพราะฉันชอบวิธีที่มันสร้างสคริปต์ sql (รวดเร็ว mdf-file อิสระและตั้งแต่ตอนนี้ทำงานให้ฉันเสมอ) ฉันตรวจสอบพารามิเตอร์บางอย่างในฟีเจอร์ 'Data Transfer' ที่ Navicat แต่ฉันไม่พบวิธีเปลี่ยนการเข้ารหัสไฟล์เอาต์พุต ฉันจะต้องทำงานพิเศษโดยใช้ Notepad ++ เพื่อเปลี่ยนการเข้ารหัส แต่มันไม่ใช่เรื่องใหญ่
Oskytar

ก็ไม่มีปัญหา แม้ว่าโดยทั่วไปแล้วขอบคุณบนเว็บไซต์นี้จะถูกส่งมอบโดยใช้คุณลักษณะ Upvote (ลูกศรขึ้นใกล้คำตอบ) หากคำตอบนั้นมีประโยชน์หรือถ้ามันแก้ปัญหาของคุณได้อย่างสมบูรณ์แม้ใช้เครื่องหมายเป็นคำตอบ (เครื่องหมายถูกใกล้คำตอบ ) :-) ดูเพิ่มเติมได้ที่นี่ในคำถามที่พบบ่อย
แมเรียน

ฉันแก้ไขความคิดเห็นล่าสุดของฉัน: เป็นไปได้ที่จะเลือกการเข้ารหัสไฟล์เอาต์พุตเมื่อเรียกใช้ 'Data Transfer' ด้วย Navicat
Oskytar

เยี่ยมยอดดังนั้นตอนนี้คุณจะสามารถข้ามขั้นตอนการแปลงด้วยตนเองได้ นั่นดีกว่า
แมเรียน

2
คำตอบนี้ดูเหมือนจะไม่ถูกต้อง ฉันมีไฟล์ที่บันทึกโดย Notepad ++ ใน UTF-8 SQLCMD.exe ไม่ถ่ายโอนอักขระอย่างถูกต้อง ถ้าฉันคัดลอกเนื้อหาไปยัง SSMS มันใช้งานได้ดี ทางออกที่แท้จริงคือคำตอบที่ได้รับจาก swasheck เพื่อเพิ่ม param -f 65001
Tomas Kubes

39

อีกตัวเลือกหนึ่งหนึ่งที่ผมได้เรียนรู้มาจากเอกสาร คุณต้องตั้งค่าเพจรหัสให้ตรงกับการเข้ารหัสไฟล์ ในกรณีของ UTF-8 เพจรหัสคือ 65001 ดังนั้นคุณต้องการ:sqlcmdsqlcmd

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


1
สิ่งนี้ช่วยชีวิตฉันฉันกำลังจะทำสคริปต์ PowerShell เพื่ออ่านไฟล์ CSV ที่มี import-csv -encoding UTF8 ไปให้ถูกต้อง ขอบคุณ
Spörri

นี้ทำงานสำหรับฉันเมื่อผมต้องใส่ค่าข้อความไอริชกับ fadas (A, E, I, O, U) เป็นคอลัมน์ NVARCHAR
noonand

นี่คือคำตอบที่ถูกต้อง
Pitchmatt

2

เรื่องแบบนี้มันยุ่งยากมากเพราะทำมากโดยไม่บอกคุณ

สิ่งแรกที่ฉันจะทำคือใช้ sqlcmd เพื่อแสดงสตริง หากแสดงอย่างถูกต้องในหน้าต่าง cmd.exe นั่นเป็นข้อเท็จจริงที่มีประโยชน์ ต่อไปฉันจะเลือกแถวที่convertมีสตริงเป็น varbinary เพื่อดูว่ามีไบต์อะไรบ้าง ฉันคิดว่าcartografíaจะปรากฏเป็น0x636172746f67726166c3ad61ที่ซึ่งการเน้นเสียง "i" แทนด้วยไบต์ c3ad ซึ่งเป็นการเข้ารหัส UTF-8 สำหรับตัวละครนั้น มันไม่ดีเลยที่จะมี UTF-8 ในคอลัมน์ Modern Spanish (Windows 1252) ค่าไบต์ใน Windows 1252 สำหรับตัวละครนั้นคือ 237 ทศนิยม (hex ED)

หากคอลัมน์มีข้อมูลที่เข้ารหัสผิดแสดงว่าข้อผิดพลาดนั้นอยู่ที่วิธีการแทรก อาจลบ N นำหน้าในค่าคงที่สตริง - N'string'บอก SQL Server เพื่อสร้างสตริง Unicode แต่ธรรมดา'string'บ่งชี้ว่าอักขระที่ใช้การเข้ารหัสของไคลเอ็นต์ - จะแทรก Modern Spanish แทน Unicode

หากคอลัมน์เก็บข้อมูลที่เข้ารหัสอย่างถูกต้องฉันจะบอกว่าคุณพบข้อบกพร่องในหน้าจอ GUI

หากคุณไม่สามารถรับ sqlcmd เพื่อแทรกข้อมูลได้อย่างถูกต้อง (นำหน้า N หรือไม่) จากนั้นคุณต้องการบ่นกับ Microsoft เมื่อคุณทำเช่นนั้นความสามารถในการแสดงไบต์ตามที่จัดเก็บไว้ในคอลัมน์ - การใช้convert(colname as varbinary)- จะมีความสำคัญต่อการอธิบายสิ่งที่ผิดพลาด


สวัสดีเจมส์ขอบคุณมากสำหรับคำตอบโดยละเอียดของคุณ ฉันทำการทดสอบบางอย่างและ Sqlcmd.exe ไม่แสดงสตริงที่ถูกต้อง เป็นปัญหาชัดเจนเกี่ยวกับการแทรกข้อมูล
Oskytar

ใช้ Profiler Sql ฉัน debugged ประโยคที่ถูกส่งไปยัง SQL Server เมื่อใช้ไคลเอนต์ GUI เซิร์ฟเวอร์ SQl INSERT INTO [ElementType] ([รหัส], [ชื่อ], [รายละเอียด], [GeometryType], [stringId], [CapturedGeometryType] ประเภทค่านิยม ('ESTACION', 'Estación', 'Estación', 'Multaci a' 'จุด'); ทำงานได้ดีดังนั้นเสียงทั้งหมดจึงถูกแทรกอย่างถูกต้อง! นั่นเป็นเดียวกัน 'แทรกประโยค' ที่ปรากฏในสคริปต์ SQL ของฉัน ฉันควรระบุรหัสอักขระในไฟล์สคริปต์ sql หรือไม่
Oskytar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.