2012-06-08 3 views
4

Qu'est-ce qu'une construction dans SQL Server T-SQL qui remplacera un Char(0), le caractère null, incorporé dans une chaîne avec son code hexadécimal?Dans SQL Server, remplacez un Char (0), le caractère null, incorporé dans une chaîne avec son code hexadécimal

I.e.

REPLACE('t'+Char(0)+'t', Char(0), REPLACE(master.dbo.fn_varbintohexstr(0), '000000', '')) 

ne renvoie pas , qu'est-ce qui fait? (Cela fonctionne déjà pour 1 à 31.)

Cette question a des réponses expliquant le problème est le classement.

Cette answer montre master.dbo.fn_varbintohexstr(0) renverra 0x00000000.

Quand je manuellement simplifié le Replace intérieur à '0x00', tout en ajoutant une clause Collate a réussi à avoir à travailler, comme les réponses à la question ci-dessus suggéré, mais je ne peux pas trouver une version qui fonctionne pour l'expression complète (qui alors pourrait être utilisé pour tout n, 0 à 31, sauter 9, 10 et 13).

Répondre

2

Ce que vous voulez pourrait être ceci.

SELECT REPLACE('t'+Char(0)+'t', Char(0), CONVERT(VARCHAR(10),REPLACE(master.dbo.fn_varbintohexstr(0), '000000', ''))) 

Vous devez convertir explicitement VARCHAR

et si vous voulez la pleine expression supprimer intérieure remplacer

SELECT REPLACE('t'+Char(0)+'t', Char(0), CONVERT(VARCHAR(10),master.dbo.fn_varbintohexstr(0))) 
+0

Juste pour être complet SQL final: 'avec m que (sélectionnez 0 comme n union all select n + 1 à partir de m où n <31) mise à jour Messages ensemble MessageText = remplacer (MessageText, char (n) assembler SQL_Latin1_General_CP1_CS_AS, CONVERT (VARCHAR (10), replace (master.dbo.fn_varbintohexstr (5), '000000', ''))) de m où n n'est pas dans (9, 10, 12, 13) et MessageText comme '%' + char (n) SQL_Latin1_General_CP1_CS_AS + '%' ' –

Questions connexes