Blob object konvertering

Jeg elsker at få udfordringer, hvor løsningen ikke lige ligger til højrebenet, men jeg vil gerne have udfordringer, hvor jeg skal dykke lidt dybere ned i SQL Serveren for at finde en forklaring på hvad der sker og hvordan det skal løses. I sidste uge fik jeg en udfordring af den slags; dog var løsningen en noget anden end jeg havde troet.

SQL Serveren

Forhistorien er, at vi fik en forespørgsel gående på at når et blob objekt i NAV blev trukket ud via SQL Query så blev resultatet ikke konverteret korrekt til danske bogstaver, og man ville selvfølgelig gerne bibeholde bla æø og å. Den nærtliggende konvertering er: 

CAST(@blob AS NVARCHAR(MAX)) 
CONVERT(NVARCHAR(MAX),@blob)

Hvilket giver dette resultat:

sql_blob_01

Jeg kan godt afsløre at det ikke giver det ønskede resultat 😊 

Nå, men næste forsøg er at prøve med varchar: 

1. CAST(@blob AS VARCHAR(MAX)) 
2. CONVERT(VARCHAR(MAX),@blob)

sql_blob_02-1

 

Løsning gennem C class og CLR

Nu er vi på rette vej, dog er der stadig udfordringer med æø og å.  

Jeg forsøgte mig efterfølgende med at skrive en funktion hvor jeg lavede en replace på de specialtegn så det blev rigtig tekst, men jeg syntes ikke det var den bedste løsning. Et alternativ kunne være at skrive en C# class og så via CLR konvertere det i SQL. Men jeg var opsat på at finde en simplere løsning. 

Jeg kiggede i diverse forum efter hints til en løsning, hvilket ledte mig ind på at konvertere til XML. 

1. CAST(@blob as XML) 

Hvilket giver dette fine resultat:

sql_blob_03-2

Herfra er det bare at caste videre til VARCHAR eller NVARCHAR og så har jeg det ønskede resultat: 

1. CAST(CAST@blob as XML) AS VARCHAR(MAX))

sql_blob_04png

XML som løsning

Jeg havde nok ikke troet at denne omvej via en cast til XML var en løsning, men det er det jo tydeligvis 😊 

Skulle du have lyst til at læse om hvordan SQL Serveren konverteret til XML så kan det læses på docslink

Har du også en udfordring, der driller så tag endelig fat i mig eller en af mine dygtige kollegaer i Unit IT, du kan fange os på tlf.: 88 333 333.