2009-09-10 28 views
9

Tôi có một truy vấn SQL mà so sánh một giá trị trong cơ sở dữ liệu một hằng số:SQL Collation xung đột khi so sánh với một cột trong một bảng temp

SELECT * FROM my_table 
INNER JOIN #TempTable tem 
    ON my_table.id = temp.id 
    AND my_table.key = 'SOME STRING' 

Và tôi nhận được lỗi:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation. 

Làm cách nào tôi có thể giải quyết vấn đề này? (Mà không làm thay đổi đối với cơ sở dữ liệu)

UPDATE: Tôi nhận được lỗi này ngay cả khi tôi tháo cuối cùng loại tương tự (so sánh string) ...

Trả lời

13

Có vẻ bạn id 's là VARCHAR s với collations khác nhau.

Hãy thử điều này:

SELECT * 
FROM my_table 
INNER JOIN 
     #TempTable tem 
ON  my_table.id = temp.id COLLATE SQL_Latin1_General_CP1_CI_AS 
     AND my_table.key = 'SOME STRING' 
+0

Cảm ơn, tôi nhận thấy rằng hadnt id của tôi là ký tự. – Justin

+0

Tuyệt vời đã giúp tôi trong một nhúm. Đáng ngạc nhiên là tôi đã nhận được điều này giữa hai bảng tạm thời, nhưng một trong hai cách này làm việc để giải quyết vấn đề. –

5

Xác định đối chiếu trong việc kê khai của bảng tạm thời của bạn.

CREATE TABLE #TempTable (ID NVARCHAR(255) COLLATE database_default) 
+0

+1 Nhưng OP đã chẩn đoán sai sự cố. Cột vấn đề là id, không phải khóa. Tôi đã điều chỉnh câu trả lời của bạn để phản ánh như vậy. –

2

Sự cố là bảng tạm thời. Nó sử dụng collation của tempdb.

Bạn có thể tạo bảng trong db thực tế của mình chứ không phải bảng tạm thời và sau đó chúng sẽ có cùng một đối chiếu. Hoặc chỉ định đối chiếu khi tạo bảng tạm thời.

+2

Không đúng - tùy thuộc vào cách bảng tạm thời được tạo ra, nó sẽ hoặc là lấy collation của cơ sở dữ liệu bạn đang ở, hoặc collation tempdb - không phải là master. Nếu bảng tạm thời được tạo ra một cách rõ ràng (CREATE TABLE #temp) thì nó sẽ lấy collation từ tempdb. Nếu bảng được bắt nguồn từ một bảng khác (SELECT * INTO #temp từ mytable) thì nó sẽ lấy collation từ bảng nguồn. –

+0

Điểm tốt ... vì chúng được tạo ra cùng một lúc I * sai * thường nhìn vào đối chiếu của chủ để tìm đối chiếu tempdb. được chỉnh sửa để kết hợp câu trả lời đúng. Ta :) –

+0

Lời khuyên không hợp lý để giải quyết sự cố bằng cách tạo bảng 'bình thường tạm thời' trong db thực tế của bạn. Có hai kỹ thuật để đảm bảo bảng tạm thời sử dụng một collation tương thích: Kev Riley cho một, (http://stackoverflow.com/a/1404916/224704) có cái kia. –

0

thử

SELECT * FROM my_table 
INNER JOIN #TempTable temp  
    ON my_table.id = temp.id collate database_default 
    AND my_table.key = 'SOME STRING' 
Các vấn đề liên quan