VARCHAR'ı VARBINARY'a dönüştürme


17

Performanstaki eğilimleri izlememize ve optimizasyon gerektiren alanları belirlememize izin vermek için, sorgu planlarıyla birlikte pahalı çalışan sorguların bir kaydını tutuyorum.

Ancak, sorgu planlarının çok fazla yer kapladığı noktaya geliyoruz (tüm planı her sorguya karşı sakladığımız için).

Bu nedenle başka bir tabloya QueryPlanHash ve QueryPlan ayıklayarak mevcut verileri normalleştirmeye çalışıyorum.

CREATE TABLE QueryPlans
(
    QueryPlanHash VARBINARY(25),
    QueryPlan XML,
    CONSTRAINT PK_QueryPlans PRIMARY KEY
    (
      QueryPlanHash
    )
);

Tanımı olarak query_plan_hash in sys.dm_exec_query_statsbir ikili alan (ve düzenli olarak yeni veri ekleme olacak), ben kullanıyordum VARBINARYbenim yeni tabloda veri türü için.

Ancak, aşağıdaki ekleme başarısız ...

INSERT INTO QueryPlans
    ( QueryPlanHash, QueryPlan )
SELECT queryplanhash, queryplan
FROM
(
    SELECT 
      p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash,
      QueryPlan,
      ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum
    FROM table
    CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1

.... hata ile

Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.

Sorun sorgu planı karma zaten ikili biçimidir, ancak XML Sorgu Planı örn.

0x9473FBCCBC01AFE

ve BINARY'ye DÖNÜŞTÜR tamamen farklı bir değer verir

0x3078393437334642434342433031414645

İkili XQuery seçiminde değer tanımı değiştirmeyi denedim, ancak sonra hiçbir değer döndürdü.

0x9473FBCCBC01AFEXML sorgu planından değerini a VARBINARYyerine a olarak nasıl ayıklayabilirim VARCHAR?

Yanıtlar:


28

Bir dizeden dönüştürürken aynı ikili değeri korumayı beklediğinizde belirli bir stil kullanmanız gerekir. Aksi takdirde SQL Server dizeyi kodladığı gibi kodlamaya çalışır 'bob'veya'frank' .

Bununla birlikte, giriş dizeniz doğru görünmüyor - bir bayt eksik veya bir bayt çok fazla. Eğer izini bırakırsanız bu iyi çalışır E:

SELECT CONVERT(VARBINARY(25), '0x9473FBCCBC01AF', 1);
------------ the ,1 is important ---------------^^^

Sonuç ikilidir:

----------------
0x9473FBCCBC01AF

1
Ah, ,1eksik olduğum şey buydu. Beklediğimden daha kolaydı! Teşekkürler!
Mark Sinkinson

Eksik / ekstra bayttan emin değilim. Sahip olduğum 2666 kayıtta, başarısız olan 183 varTRY_CONVERT
Mark Sinkinson

Tek karakter sayısına sahip herhangi bir dizeye bir karakter (örneğin, 0) eklemeniz gerekebilir. Bu değeri değiştirir, ancak her zaman aynı değeri aynı şekilde değiştirmelidir (ve 0 ile veya 0 olmadan herhangi bir çarpışma olacağından şüphelenmiyorum).
Aaron Bertrand

Bu bir hata değil mi? Xml'deki sorgu planı açıkça bu değere ayarlanmıştır ... Şüphesiz a TRY_CONVERT- a BINARYdönmemelidirNULL
Mark Sinkinson

Tabloma kaydedilen değerleri xml ile karşılaştırmak aslında eksik 0 önde gelen. Bu nedenle değer 0x09473FBCCBC01AF olmalıdır. Bunları basit bir DEĞİŞTİRME ile düzeltebilirim, ama eminim bir hata ...
Mark Sinkinson

0

Bir XML sorgu planından 0x9473FBCCBC01AFE değerini bir VARCHAR yerine VARBINARY olarak nasıl ayıklayabilirim?

Ben CASD tabloları sorgulamak için HeidiSQL kullanarak böyle bir şeyle karşı karşıya ve bu gibi fn_varbintohexstr () ile çözüldü :

SELECT master.dbo.fn_varbintohexstr(table.hexfield) FROM table;

HeidiSQL ile değer '0x3F3F3F3F3F3F3F3F' gibi yanlıştı ve '0x158B1DB75616484695684007CE98E21C' gibi doğru oldu.

OBS: MSSQL 2008'den beri çalışıyor! Umarım yardımcı olur!


2
fn_varbintohexstr() Burada belirtilen kullanım uyarılarını not edin .
Erik
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.