Lệnh SQLCMD không thể chèn dấu


19

Tôi đang cố gắng chạy sqlcmd.exe để thiết lập cơ sở dữ liệu mới từ dòng lệnh. Tôi đang sử dụng SQL SERVER Express 2012 trên Windows 7 64 bit.

Đây là lệnh tôi sử dụng:

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

Và đây là một đoạn của tập lệnh tạo tập tin 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'

Vâng, xin vui lòng kiểm tra rằng có một số điểm nhấn trên các từ; đó là mô tả của bảng. Cơ sở dữ liệu được tạo ra không có vấn đề. 'Đối chiếu' được hiểu bởi kịch bản, như bạn có thể thấy trong ảnh chụp màn hình đính kèm. Mặc dù vậy, các dấu không được hiển thị đúng khi kiểm tra bảng.Vấn đề đối chiếu

Tôi thực sự đánh giá cao bất kỳ sự giúp đỡ. Cảm ơn nhiều.

[Chỉnh sửa]: Chào tất cả. Thay đổi mã hóa tệp SQL bằng Notepad ++ hoạt động tốt! Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn: Tôi đã học được một điều thú vị với vấn đề này!

nhập mô tả hình ảnh ở đây


1
Mã hóa tệp tập lệnh SQL của bạn là gì?
Pondlife

Tôi sẽ đi với ý tưởng của @ Pondlife. Lấy trình soạn thảo văn bản (như Notepad ++), mở tệp .sql ở đó, đi đến Mã hóa và thấy rằng tệp của bạn không ở trong ANSI (hoặc một số mã hóa không được hỗ trợ khác). Nếu có, chọn chuyển đổi tập tin sang một số thứ khác. Tôi muốn nói UTF8 nên làm điều đó. Cho chúng tôi biết làm thế nào nó đi.
Mary

Câu trả lời:


8

Từ các bình luận, vấn đề không chính xác với bảng hoặc cách SQLCMD nhập các ký tự đặc biệt. Thông thường, nhập có vấn đề có liên quan đến định dạng của chính tập lệnh.

Bản thân Management Studio cung cấp tùy chọn lưu với một mã hóa cụ thể, sẽ giải quyết vấn đề trong tương lai. Khi lưu tệp lần đầu tiên (hoặc sử dụng lưu dưới dạng), bạn nên nhấp vào mũi tên nhỏ gần nút Lưu , để sử dụng tùy chọn Lưu với mã hóa .

nhập mô tả hình ảnh ở đây

Theo mặc định, nó lưu tệp ở Tây Âu (1252) . Bất cứ khi nào tôi có bất kỳ ký tự đặc biệt nào, tôi đều sử dụng UTF8 (mặc dù có thể một số mã hóa hạn chế khác sẽ phù hợp) bởi vì đó thường là cách khắc phục nhanh nhất.

nhập mô tả hình ảnh ở đây

Tôi không chắc chắn (từ pic) rằng bạn đang sử dụng SSMS, vì vậy vui lòng đảm bảo rằng trình soạn thảo của riêng bạn có tùy chọn lưu tệp theo mã hóa khác. Nếu không, chuyển đổi tệp trong trình chỉnh sửa thông minh (như bạn đã thử trong Notepad ++) thường hoạt động. Mặc dù điều đó có thể không hoạt động nếu bạn chuyển đổi từ mã hóa rộng sang mã hóa hẹp hơn và sau đó trở lại mã hóa rộng (ví dụ: từ Unicode sang ANSI và trở lại Unicode).


Chào Mary. Cám ơn bạn một lần nữa. Tôi đã sử dụng tính năng 'Truyền dữ liệu' từ Navicat, vì tôi thích cách nó tạo tập lệnh sql (nhanh chóng, độc lập với tệp mdf và từ bây giờ luôn hoạt động với tôi). Tôi đã kiểm tra một số tham số trong tính năng 'Truyền dữ liệu' tại Navicat, nhưng tôi không tìm thấy cách nào để thay đổi mã hóa tệp đầu ra. Tôi sẽ phải thực hiện một số công việc bổ sung bằng Notepad ++ để thay đổi mã hóa, nhưng đó không phải là vấn đề lớn.
Oskytar

Vâng, không có vấn đề. Mặc dù, thông thường, cảm ơn trên trang web này được phân phối bằng tính năng Upvote (mũi tên lên gần câu trả lời) nếu câu trả lời hữu ích hoặc, nếu nó giải quyết hoàn toàn vấn đề của bạn, thậm chí sử dụng Dấu làm câu trả lời (Dấu kiểm gần câu trả lời ) :-). Xem thêm ở đây, trong FAQ .
Mary

Tôi sửa nhận xét cuối cùng của mình: IT IS có thể chọn mã hóa đầu ra tệp khi thực hiện 'Truyền dữ liệu' với Navicat.
Oskytar

Thật tuyệt, vì vậy bây giờ bạn sẽ có thể bỏ qua bước chuyển đổi thủ công. Điều đó thậm chí còn tốt hơn.
Mary

2
Câu trả lời này dường như không chính xác. Tôi đã lưu tập tin bằng Notepad ++ trong UTF-8. SQLCMD.exe không chuyển các ký tự chính xác. Nếu tôi sao chép nội dung vào SSMS, nó hoạt động tốt. Giải pháp thực sự là câu trả lời được cung cấp bởi swasheck để thêm param -f 65001.
Tomas Kubes

38

Một tùy chọn khác, người ta mà tôi vừa học được, xuất phát từ các sqlcmdtài liệu hướng dẫn . Bạn cần đặt codepage cho sqlcmdphù hợp với mã hóa tập tin. Trong trường hợp UTF-8, codepage là 65001 nên bạn muốn:

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


1
Điều này vừa cứu mạng tôi, tôi chuẩn bị thực hiện một tập lệnh powershell để đọc một tệp CSV với UTF8 nhập mã-csv, hãy hiểu điều này. Cảm ơn
Sporri

Điều này hiệu quả với tôi khi tôi phải chèn các giá trị văn bản Ailen bằng fadas (á, é, í, ó, ú) vào một cột NVARCHAR
buổi trưa

Đây là câu trả lời đúng
Pitchmatt

2

Điều này là rất khó khăn bởi vì rất nhiều việc được thực hiện mà không nói với bạn.

Điều đầu tiên tôi sẽ làm là sử dụng sqlcmd để hiển thị chuỗi. Nếu nó hiển thị chính xác trong cửa sổ cmd.exe, đó là một thực tế hữu ích. Tiếp theo, tôi sẽ chọn hàng converting chuỗi thành varbinary để xem byte nào thực sự ở đó. Tôi nghĩ cartografía sẽ hiển thị dưới dạng 0x636172746f67726166c3ad61, trong đó chữ "i" có dấu được biểu thị bằng byte c3ad, là mã hóa UTF-8 cho ký tự đó. Thật không tốt khi có UTF-8 trong một cột tiếng Tây Ban Nha hiện đại (Windows 1252). Giá trị byte trong Windows 1252 cho ký tự đó là 237 thập phân (hex ED).

Nếu cột chứa dữ liệu bị mã hóa sai, thì lỗi nằm ở cách nó được chèn. Có lẽ loại bỏ N hàng đầu trong các hằng chuỗi - N'string'bảo SQL Server tạo chuỗi Unicode, nhưng đơn giản 'string'chỉ ra các ký tự sử dụng mã hóa của máy khách - sẽ chèn tiếng Tây Ban Nha hiện đại thay vì Unicode.

Nếu cột giữ dữ liệu được mã hóa chính xác, thì tôi sẽ nói rằng bạn đã tìm thấy một lỗi trong màn hình GUI.

Nếu bạn không thể có được sqlcmd để chèn dữ liệu chính xác (dẫn đầu N hoặc không), thì bạn muốn khiếu nại với Microsoft. Khi bạn làm như vậy, việc có thể hiển thị các byte như được lưu trữ trong cột - bằng cách sử dụng convert(colname as varbinary)- sẽ rất quan trọng để giải thích những gì đang xảy ra.


Xin chào James, cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn. Tôi đã thực hiện một số thử nghiệm và Sqlcmd.exe không hiển thị đúng chuỗi. Đây rõ ràng là một vấn đề về cách chèn dữ liệu.
Oskytar

Sử dụng Sql Profiler, tôi đã gỡ lỗi những câu nào được gửi đến SQL SERVER khi sử dụng máy khách GUI của máy chủ SQl. XÁC NHẬN VÀO [ElementType] ([Mã], [Tên], [Mô tả], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ('ESTACION', 'Estación', 'Estación', 'Multipoint', ' 'Điểm'); FINE hoạt động, vì vậy tất cả các dấu được chèn đúng cách!. Đó là cùng một câu 'chèn câu' xuất hiện trong tập lệnh sql của tôi. Tôi có nên chỉ định mã ký tự trong tệp script sql không?
Oskytar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.