แปลง varchar เป็น uniqueidentifier ใน SQL Server


104

ตารางที่ฉันไม่สามารถควบคุมสคีมามีคอลัมน์ที่กำหนดเป็น varchar (50) ซึ่งเก็บตัวบ่งชี้ที่ไม่ซ้ำกันในรูปแบบ 'a89b1acd95016ae6b9c8aabb07da2010' (ไม่มียัติภังค์)

ฉันต้องการแปลงสิ่งเหล่านี้เป็นตัวบ่งชี้เฉพาะใน SQL เพื่อส่งผ่านไปยัง. Net Guid อย่างไรก็ตามบรรทัดแบบสอบถามต่อไปนี้ใช้ไม่ได้สำหรับฉัน:

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

และส่งผลให้:

ข่าวสารเกี่ยวกับ 8169 ระดับ 16 สถานะ 2 บรรทัดที่ 1
การแปลงล้มเหลวเมื่อแปลงจากสตริงอักขระเป็น uniqueidentifier

แบบสอบถามเดียวกันโดยใช้ตัวบ่งชี้เฉพาะที่มียัติภังค์ทำงานได้ดี แต่ข้อมูลจะไม่ถูกจัดเก็บในรูปแบบนั้น

มีวิธีอื่น (ที่มีประสิทธิภาพ) ในการแปลงสตริงเหล่านี้เป็นตัวบ่งชี้เฉพาะใน SQL - ฉันไม่ต้องการทำในรหัส. Net


เพียงแค่แถวของอักขระและตัวเลขเท่านั้นไม่ใช่การแสดง GUID ที่ถูกต้อง - คุณจะต้องใช้เวทมนตร์ในการแยกวิเคราะห์สตริงอย่างที่ Quassnoi แสดงในคำตอบของเขา
marc_s

คำตอบ:


127
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
ฉันหวังจริงๆว่านี่จะไม่ใช่ทางออก แต่ฉันเดาว่าเราจะพบในไม่ช้า ...
ระเบิดมือ

22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** เท่านี้ก็เพียงพอแล้ว เพิ่งลองใช้.
Fabio Milheiro

โอ้ใช่! งั้นก็ต้องยอม สิ่งที่ชัดเจนคือใส่ยัติภังค์ในตำแหน่งที่ถูกต้องเท่านี้คุณก็พร้อมแล้ว ขออภัย!
Fabio Milheiro

การวางข้อมูลโค้ดนี้ในฟังก์ชันเป็นส่วนเสริมที่ดีสำหรับชุดเครื่องมือของคุณโดยเฉพาะอย่างยิ่งเนื่องจากอนุกรม JSON บางตัวจะลบเส้นประจาก GUID เมื่อทำให้เป็นอนุกรมทำให้ยากต่อการคัดลอกวางลงใน SQL เพื่อแก้ไขข้อบกพร่อง
David Cumps

27

มันจะทำให้ฟังก์ชั่นที่มีประโยชน์ นอกจากนี้โปรดทราบว่าฉันใช้ STUFF แทน 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
ใช้ Stuff () ได้ดีเยี่ยม ฉันต้องการอ้างอิงฟิลด์ของฉันเพียงครั้งเดียวในคำสั่ง Select โดยใช้วิธีของคุณ ฉันหลีกเลี่ยง Scalar-Functions เพราะมันไม่ค่อย "ปรับขนาด" ได้ดีฉันจึงเขียนมันออกมา ขอบคุณสิ่งนี้จะเกิดขึ้นในตัวอย่างโค้ดของฉัน!
MikeTeeVee

18

varchar col C ของคุณ:

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


-4

หากสตริงของคุณมีอักขระพิเศษคุณสามารถแฮชเป็น md5 แล้วแปลงเป็น guid / uniqueidentifier

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

8
สิ่งนี้จะแปลงสตริงอินพุตเป็น GUID ที่แตกต่างกันโดยสิ้นเชิง
Aaroninus

-6

คำแนะนำที่ให้มาไม่ใช่รูปแบบที่ถูกต้อง (.net ให้คำแนะนำ)

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

6
สิ่งนี้ตอบคำถามเกี่ยวกับการแปลง varchar โดยไม่มียัติภังค์เป็น GUID ได้อย่างไร รหัสทั้งหมดนี้พิมพ์ 1
Aaroninus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.