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.
rowversion
ne peut pas être utilisé comme identifiant, soit, si vous pensé que vous pouvez utiliser comme un homme-clé lisiblerowversion 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 siAlors 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
Vous devez vous connecter pour publier un commentaire.
SELECT 'test' + CONVERT(NVARCHAR(MAX), CONVERT(BINARY(8), RowVersion), 1)
. Le truc, c'est le1
à laCONVERT
comme le style, par la la documentation. (Passer2
d'omettre le0x
.)Explicit conversion from data type timestamp to nvarchar(max) is not allowed
. Si je l'ai changer pourVARCHAR
, il n'y a pas d'erreur, mais il montre encore des ordures comme décrit dans la Question.My bad, j'ai, à tort, SQL Server traiter
ROWVERSION
comme un type binaire. Il n'a pas, jusqu'à une conversion intermédiaire de l'étape est nécessaire pour faire ce travail.en s'appuyant sur des fonctions non documentées s'est manifestement pire que de s'appuyer sur les fonctionnalités intégrées de
CONVERT
. Ce que vous accepter, c'est à vous, bien sûr, mais je sais ce que je préfère dans un environnement de production.avez-vous essayé la version éditée de Jeroen Mostert's solution? Il fonctionne pour moi avec l'étape supplémentaire de
CONVERT
ingBINARY(8)
d'abord, avant de puisCONVERT
ingNVARCHAR
... en tant Que tel, et pour les raisons indiquées ci-dessus par Jeroen, j'ai upvoted cette réponse que je crois que c'est mieux que le mien.OK, mon mauvais cette fois. Oui, la version modifiée d'œuvres. En fait, maintenant, je préfère cette réponse que l'hex de lettres restent en majuscules (ressemble plus belle). Ce n'est pas le code de production (c'est juste un script pour m'aider dans dev), mais je préfère faire les choses de la manière la plus appropriée, et je pense que c'est elle. Je vais changer la accepté de Répondre à celui-ci, mais encore upvote votre one, @3N1GM4. Merci pour l'honnêteté!
OriginalL'auteur Jeroen Mostert
Comme mentionné dans les commentaires, les sans-papiers de la fonction
master.sys.fn_varbintohexstr
va le convertir en binaire à la chaîne de telle sorte que vous pourriez ensuite concaténer avec une autre chaîne de valeur:Je suis allé de l'avant et de diviser les deux premiers caractères et n'appliquent pas la
UPPER
fonction pour eux, reproduisent exactement le format affiché lorsqu'une valeur binaire.Résultats:
SELECT TOP 1 'test' + master.sys.fn_varbintohexstr(RowVersion) FROM MyTable
me fait exactement ce dont j'ai besoin.OriginalL'auteur 3N1GM4
Ont un coup d'oeil à ceci:
OriginalL'auteur daniel