Comment faire pour convertir les valeurs TIMESTAMP VARCHAR en T-SQL, comme le SSM?

Je suis en train de convertir un TIMESTAMP champ dans une table d'une chaîne de sorte qu'il peut être imprimé ou exécuté dans le cadre du SQL dynamique. SSM est capable de le faire, donc il doit y avoir une méthode intégrée pour le faire. Cependant, je ne peux pas le faire fonctionner à l'aide de T-SQL.

Le suivant affiche correctement un résultat de table:

SELECT TOP 1 RowVersion FROM MyTable

Il montre 0x00000000288D17AE. Cependant, j'ai besoin de la raison d'être de la partie d'une chaîne plus longue.

DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(BINARY(8), RowVersion) FROM MyTable)
PRINT(@res)

Cela donne une erreur: The data types varchar and binary are incompatible in the add operator

DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable)
PRINT(@res)

Cette résultats dans les personnages: test (®

En fait, les espaces ne sont que des caractères null et mettre fin à la chaîne de l'objectif de l'exécution de SQL dynamique à l'aide de EXEC().

DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 1 ''test'' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable'
EXEC (@sql)

C'est simplement l'affichage d'un résultat de table avec le mot "test". Tout ce qui est après "test" dans le SQL dynamique est coupée parce que le CONVERT fonction renvoie la valeur null caractères première.

Évidemment, ce que je veux, la chaîne résultante est "test0x00000000288D17AE", ou encore l'équivalent décimal, qui dans ce cas serait "test680335278".

Toutes les idées seraient grandement appréciés.

SSMS ne pas faire une telle conversion. Il affiche les données dans une grille comme aucun d'autres .NET application. Les valeurs binaires sont généralement montré que hex ou Base64. Pourquoi voulez-vous convertir un fichier binaire de la valeur à une chaîne? Pourquoi ne pas le passer comme est, ou l'utiliser comme paramètre? BTW rowversion ne peut pas être utilisé comme identifiant, soit, si vous pensé que vous pouvez utiliser comme un homme-clé lisible
rowversion est un binary(8) valeur, tout comme bigint. Vous pouvez le convertir en bigint puis utiliser les FORMAT pour obtenir sa représentation hexadécimale, par exemple, FORMAT(cast(RowVersion)as bigint),"x") ou FORMAT(cast(cast(RowVersion as binary(8))as bigint),"x"). Format ne pavé de la chaîne avec des zéros si
Alors qu'il est sans-papiers, je crois master.sys.fn_varbintohexstr permettra de convertir n'importe quel VARBINARY type de la valeur à un NVARCHAR valeur. Voir ici pour avoir des infos sur le fonctionnement de cette fonction, le long avec le code source.

OriginalL'auteur Neo | 2016-12-07