Chuyển đổi varchar thành uniqueidentifier trong SQL Server


104

Một bảng mà tôi không có quyền kiểm soát lược đồ, chứa một cột được định nghĩa là varchar (50) lưu trữ các mã số duy nhất ở định dạng 'a89b1acd95016ae6b9c8aabb07da2010' (không có dấu gạch nối)

Tôi muốn chuyển đổi các mã này thành mã số duy nhất trong SQL để chuyển tới Hướng dẫn .Net. Tuy nhiên, các dòng truy vấn sau không phù hợp với tôi:

select cast('a89b1acd95016ae6b9c8aabb07da2010' as uniqueidentifier)
select convert(uniqueidentifier, 'a89b1acd95016ae6b9c8aabb07da2010')

và kết quả là:

Bản tin 8169, Mức 16, Trạng thái 2, Dòng 1
Chuyển đổi không thành công khi chuyển đổi từ chuỗi ký tự thành mã định danh duy nhất.

Các truy vấn tương tự sử dụng mã số duy nhất có gạch nối hoạt động tốt nhưng dữ liệu không được lưu trữ ở định dạng đó.

Có cách nào khác (hiệu quả) để chuyển đổi các chuỗi này thành mã số duy nhất trong SQL không. - Tôi không muốn làm điều đó trong mã .Net.


chỉ một hàng ký tự và số thực sự không phải là biểu diễn GUID hợp lệ - bạn sẽ phải dùng đến phép thuật phân tích chuỗi như Quassnoi đã trình bày trong câu trả lời của mình.
marc_s

Câu trả lời:


126
DECLARE @uuid VARCHAR(50)
SET @uuid = 'a89b1acd95016ae6b9c8aabb07da2010'
SELECT  CAST(
        SUBSTRING(@uuid, 1, 8) + '-' + SUBSTRING(@uuid, 9, 4) + '-' + SUBSTRING(@uuid, 13, 4) + '-' +
        SUBSTRING(@uuid, 17, 4) + '-' + SUBSTRING(@uuid, 21, 12)
        AS UNIQUEIDENTIFIER)

10
Tôi đã thực sự hy vọng điều này sẽ không phải là giải pháp nhưng tôi đoán chúng tôi sẽ sớm tìm ra ...
lựu đạn

22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Điều này là đủ. Chỉ cần thử nó.
Fabio Milheiro

Ồ vâng! Vậy thì tôi phải đồng ý. Điều hiển nhiên là đặt các dấu gạch nối vào đúng vị trí và bạn đã sẵn sàng! Lấy làm tiếc!
Fabio Milheiro

Đặt đoạn mã này trong một hàm là một bổ sung tuyệt vời cho bộ công cụ của bạn, đặc biệt là vì một số trình tuần tự JSON loại bỏ các dấu gạch ngang khỏi GUID khi tuần tự hóa, khiến việc sao chép dán vào SQL để gỡ lỗi khó hơn.
David Cumps

27

Nó sẽ tạo ra một chức năng tiện dụng. Ngoài ra, lưu ý rằng tôi đang sử dụng STUFF thay vì SUBSTRING.

create function str2uniq(@s varchar(50)) returns uniqueidentifier as begin
    -- just in case it came in with 0x prefix or dashes...
    set @s = replace(replace(@s,'0x',''),'-','')
    -- inject dashes in the right places
    set @s = stuff(stuff(stuff(stuff(@s,21,0,'-'),17,0,'-'),13,0,'-'),9,0,'-')
    return cast(@s as uniqueidentifier)
end

4
Sử dụng tuyệt vời Stuff (). Tôi chỉ cần tham chiếu trường của mình một lần trong câu lệnh Chọn bằng phương pháp của bạn. Tuy nhiên, tôi tránh các Hàm vô hướng, bởi vì chúng không phải lúc nào cũng hoàn toàn "quy mô" tốt, vì vậy tôi viết nó ra. Cảm ơn, điều này sẽ xuất hiện trong Đoạn mã của tôi!
MikeTeeVee

18

varchar col C của bạn:

SELECT CONVERT(uniqueidentifier,LEFT(C, 8)
                                + '-' +RIGHT(LEFT(C, 12), 4)
                                + '-' +RIGHT(LEFT(C, 16), 4)
                                + '-' +RIGHT(LEFT(C, 20), 4)
                                + '-' +RIGHT(C, 12))

10
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))

-4

Nếu chuỗi của bạn chứa các ký tự đặc biệt, bạn có thể băm nó thành md5 và sau đó chuyển đổi nó thành một hướng dẫn / uniqueidentifier.

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))

8
Này chuyển chuỗi đầu vào cho một GUID hoàn toàn khác nhau
Aaroninus

-6

Hướng dẫn được cung cấp không đúng định dạng (Hướng dẫn được cung cấp .net).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch

6
Làm thế nào để trả lời câu hỏi chuyển đổi một varchar không có dấu gạch nối thành GUID? Tất cả các mã này không có gì in 1.
Aaroninus
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.