SQL Server tránh lặp lại kiểu đối chiếu nhiều lần trong một truy vấn


8

Tôi có một truy vấn chọn các hàng từ cơ sở dữ liệu nguồn (DatabaseA) và chèn chúng vào cơ sở dữ liệu đích (Cơ sở dữ liệu B). Kiểu đối chiếu khác nhau giữa các cơ sở dữ liệu và chúng không thể thay đổi. Tôi cần giải quyết sự khác biệt đối chiếu trong truy vấn của mình bằng cách chỉ định rõ ràng đối chiếu cho các trường varchar.

Hiện tại truy vấn của tôi trông như thế này:

INSERT INTO DatabaseB.dbo.Users(
    Id,
    UserNumber,
    FirstName,
    Surname,
    Address1,
    Address2,
    AddressTown,
    AddressCity
)
SELECT 
    Id,
    UserNumber,
    FirstName COLLATE SQL_Latin1_General_CI_AS,
    Surname COLLATE SQL_Latin1_General_CI_AS,
    Address1 COLLATE SQL_Latin1_General_CI_AS,
    Address2 COLLATE SQL_Latin1_General_CI_AS,
    AddressTown COLLATE SQL_Latin1_General_CI_AS,
    AddressCity COLLATE SQL_Latin1_General_CI_AS
FROM DatabaseA.dbo.Users

Câu hỏi của tôi là, tôi có thể tránh gõ kiểu đối chiếu cho mọi trường dựa trên chuỗi không? Có cách nào để tôi có thể chỉ định loại đối chiếu cho toàn bộ truy vấn không? Nếu điều này là không thể, có bất kỳ phím tắt nào khác không?


Không có phím tắt. Bạn có thể sử dụng cơ sở dữ liệu thay thế (Nếu bạn thích) và nếu điều đó là chính xác trong trường hợp này.
SqlWorldWide

Câu trả lời:


9

Một lần bạn có thể tạo chế độ xem bằng các định nghĩa cột như thế này:

FirstName COLLATE SQL_Latin1_General_CI_AS, ...

Sau đó, bất cứ lúc nào bạn muốn sử dụng bảng Người dùng, bạn có thể sử dụng chế độ xem này để thay thế.


5

Các bộ sưu tập trên mỗi cột / biểu thức chuỗi (loại trừ kiểu dữ liệu XML). Vì vậy, theo nghĩa này, không, Collations không thể được đặt cho mỗi Bảng hoặc truy vấn.

Tôi cần giải quyết sự khác biệt đối chiếu trong truy vấn của mình bằng cách chỉ định rõ ràng đối chiếu cho các trường varchar.

Ừm, tại sao? Bạn không cần phải giải quyết vấn đề này INSERT. Xung đột đối chiếu phát sinh khi so sánh hai cột hoặc kết hợp hai hoặc nhiều cột trong a UNION. Như bạn có thể thấy với bài kiểm tra bên dưới (chỉ chạy trong Cơ sở dữ liệu không có tempdb), có hai bảng, mỗi bảng trong một cơ sở dữ liệu khác nhau, mỗi bảng có một Đối chiếu khác nhau - một là Đối chiếu SQL Server và một là Đối chiếu Windows thậm chí - và không có lỗi. Nếu bạn gặp lỗi, vui lòng cung cấp thêm chi tiết trong câu hỏi.

--DROP TABLE #tmp;
CREATE TABLE #tmp (Col1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS);
INSERT INTO #tmp ([Col1]) VALUES ('n');

-- DROP TABLE dbo.Tmp;
CREATE TABLE dbo.Tmp (Col1 VARCHAR(50) COLLATE Hebrew_100_CS_AI);

INSERT INTO dbo.Tmp ([Col1])
  SELECT t.[Col1]
  FROM #tmp t;

Làm thế nào về cái này? <br/> code TẠO BẢNG #tmp (Col1 VARCHAR (50) THU THẬP Cyrillic_General_CI_AS); XÁC NHẬN VÀO #tmp ([Col1]) GIÁ TRỊ (N 'рррр р р р р р - BẢNG DROP dbo.Tmp; TẠO BẢNG dbo.Tmp (Col1 VARCHAR (50) THU THẬP SQL_Latin1_General_CP1_CI_AS); XÁC NHẬN VÀO dbo.Tmp ([Col1]) CHỌN t. [Col1] TỪ #tmp t; chọn * từ dbo.Tmp; code
nhiễm trùng

Tôi xin lỗi, định dạng trong các bình luận là khác nhau và tôi không thể nhập mã ở dạng có thể đọc được; Tôi chỉ muốn nói rằng thực tế bạn không có lỗi không có nghĩa là bạn đã làm đúng. Hãy thử thực thi mã được định dạng khủng khiếp của tôi trong đó tôi sao chép ký tự mã hóa ascii vào một cột có đối chiếu Latin hoặc sửa đổi ví dụ của bạn để bạn sao chép ký tự tiếng Do Thái ascii vào cột không mã hóa với đối chiếu Latin, bạn sẽ nhận được ?????? thay vì dữ liệu của bạn, nghĩa là bạn MẤT dữ liệu của mình mãi mãi
sepupic

Vâng, bạn hoàn toàn chính xác. Tuy nhiên, câu hỏi cho biết không có gì chuyển đổi ký tự là vấn đề, hoặc NVARCHAR/ Unicode. Các từ ngữ hiện nay phần nào ngụ ý VARCHARđến VARCHAR. Vui lòng chỉ định cả Collations trong câu hỏi và nếu đây là hoạt động một lần hoặc đang diễn ra. Ngoài ra, trích dẫn trở lại sẽ định dạng mã trong ý kiến. Trợ giúp (có thể nhận được từ trình chỉnh sửa) có một trang đánh dấu được hỗ trợ trong các bình luận :-)
Solomon Rutzky

Nhờ sự giúp đỡ của bạn với điều này. Thật không may, vấn đề thế giới thực không đơn giản như ví dụ tôi đã tạo ở trên. Tôi đã làm nó như vậy để vấn đề dễ hình dung. Giải pháp duy nhất là chỉ định loại đối chiếu cho từng trường varchar :(
Laurence Frost

@sepupic Xin lỗi về việc yêu cầu bạn cập nhật câu hỏi. Tôi đã trả lời điện thoại của mình và bị lẫn vào tên Đăng nhập. Tôi đã chạy ví dụ của bạn và nó không có ý nghĩa như tất nhiên bạn sẽ nhận được ?vì các ký tự Cyrillic không tồn tại trong Mã trang 1252 (nghĩa là Latin1_General_CP1, được sử dụng trong bảng đích). Kịch bản đó không được hưởng lợi từ việc COLLATEthêm từ khóa, vì vậy không cần phải giải quyết nó vì OP dường như đang hỏi về một kịch bản mà việc thêm COLLATEkhông giúp ích.
Solomon Rutzky
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.