Seçmede Eşleşen Ekstra Karakterlere Sahip Benzersiz Tanımlayıcı


19

SQL Server 2012'yi benzersiz bir tanımlayıcı ile kullanıyoruz ve sonuna eklenen karakterlerle (36 karakter değil) seçimler yaparken yine de bir UUID ile eşleşme döndürdüğünü fark ettik.

Örneğin:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 

uuid ile satırı döndürür 7DA26ECB-D599-4469-91D4-F9136EC0B4E8.

Ama koşarsanız:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'

ayrıca uuid ile satırı döndürür 7DA26ECB-D599-4469-91D4-F9136EC0B4E8.

SQL Server, seçimlerini yaparken 36 ötesindeki tüm karakterleri yok sayıyor gibi görünüyor. Bu bir hata / özellik mi yoksa yapılandırılabilecek bir şey mi?

Ön uçta uzunluk için doğrulama yaptığımız için büyük bir sorun değil ama bana doğru davranış gibi görünmüyor.

Yanıtlar:


10

Örtük dönüştürme, değer süslü parantez içine alınmışsa da çalışır {...}.

Bunları sorguya eklerseniz, orijinal değer çok uzunsa, sonuncu }yanlış yerde sonuçlandığı için örtük dönüşüm başarısız olur .

select * 
from some_table 
where uuid = '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8'+'}'

Dönüştürmeyi denerseniz

SELECT CONVERT(UNIQUEIDENTIFIER, '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'+'}');

anladın

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

10

SQL Server, seçimlerini yaparken 36 ötesindeki tüm karakterleri yok sayıyor gibi görünüyor. Bu bir hata / özellik mi yoksa yapılandırılabilecek bir şey mi?

Davranış belgelenmiştir için kitaplar Çevrimiçi girişi uniqueidentifiertürü :

BOL giriş özütü

Bahsedilen örnek şöyledir:

BOL örneği

Bununla birlikte, örtük dönüşümlerden kaçınmayı tercih ederim. Bir uniqueidentifierdeğişmez ODBC kaçış sözdizimi kullanılarak doğrudan T-SQL'e yazılabilir:

DECLARE @T AS TABLE
(
    uuid uniqueidentifier UNIQUE NOT NULL
);

INSERT @T (uuid)
SELECT {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

Bu, SQL Server'ın bir dize temsilini bir türe sabit olarak katlarken yürütme planlarında dahili olarak kullandığı sözdiziminin aynısıdır uniqueidentifier:

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8';

Uuid dizin arama

uniqueidentifiersSQL Server'a yazıp SQL Server'dan geçip geçemeyeceğiniz , kullandığınız kitaplığa bağlı olabilir, ancak 36 karakter dizeleri kullanılabilir seçeneklerden en az isteneni olarak bana çarpıyor. Dönüşümleri gerçekleştirmeniz gerekiyorsa, bunları açık yapın ve dize yerine 16 baytlık bir ikili değer kullanın.


9

Ek karakterler, örtük dönüştürme sırasında SQL Server tarafından yoksayılır (iyi, sessizce kesilir). Örneğin:

SELECT CONVERT(UNIQUEIDENTIFIER, '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS');

Sonuç:

------------------------------------
7DA26ECB-D599-4469-91D4-F9136EC0B4E8

Bu, bu senaryodan farklı değildir:

DECLARE @x VARCHAR(1) = 'xyz';
SELECT @x;

Sonuç:

----
x  

Bunu yapılandıramazsınız, ancak değişkeninizin dönüşümde başarısız olmasını istiyorsanız, değişkeni CHAR(36)ilk önce bir tabloya doldurmayı deneyebilirsiniz , bu da kesme nedeniyle başarısız olur:

DECLARE @x TABLE(y CHAR(36));
INSERT @x SELECT '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS';

Sonuç:

Msg 8152, Level 16, State 14, Line 2
String or binary data would be truncated.
The statement has been terminated.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.