私がスキーマを制御できないテーブルには、varchar(50)として定義された列が含まれます。この列には、 'a89b1acd95016ae6b9c8aabb07da2010'(ハイフンなし)の形式で一意の識別子が格納されます。
これらをSQLのuniqueidentifierに変換して、.Net Guidに渡したいと思います。ただし、次のクエリ行は機能しません。
select cast('a89b1acd95016ae6b9c8aabb07da2010' as uniqueidentifier)
select convert(uniqueidentifier, 'a89b1acd95016ae6b9c8aabb07da2010')
そして結果:
メッセージ8169、レベル16、状態2、行1 文字列からuniqueidentifierへの変換時に変換に失敗しました。
ハイフンで区切られたuniqueidentifierを使用した同じクエリは正常に機能しますが、データはその形式で保存されません。
これらの文字列をSQLのuniqueidentifiersに変換する別の(効率的な)方法はありますか。 -.Netコードでそれをしたくありません。
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)
便利な機能になります。また、SUBSTRINGの代わりにSTUFFを使用していることに注意してください。
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
あなたの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))
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))