Je cherche un moyen de récupérer le modèle de données d'entité ( EDM ) de la table __MigrationHistory
en utilisant seulement T-SQL (donc n'importe qui, en utilisant Microsoft SQL Server Management Studio seulement, pourrait faire de même).
Je veux avoir une valeur de chaîne BASE64 valide.
Je ne veux pas le décompresser complètement pour EDMX .
Je ne veux pas l'obtenir à partir du fichier de migration *.resx
.
Lorsque je sélectionne __MigrationHistory
Entier dans SSMS, la valeur de la colonne Model
est comme suit
0x1F8B0800000000000400CD57DB6EDB38107D5F60FF81E0D31648C5247DD906528BD4898BA075525469DF6969EC10CB8BCA4B607F5B1FFA49FB0B3BBACB521CB7E9A228020422357366E6F0CC50FEF7EBB7F8F54649720FD609A3137A121D53023A33B9D0EB8406BF7AFE377DFDEACF3FE2CB5C6DC8E7D6EE4569879EDA25F4CEFBE28C3197DD81E22E5222B3C699958F32A318CF0D3B3D3E7EC94E4E182004452C42E28F417BA1A05AE072667406850F5C2E4C0ED235FBF826AD50C93557E00A9E414253AE0A0917DCF325771035CB254278D8784ACEA5E098550A724509D7DA78EE31E7B34F0E526F8D5EA7056E7079BB2D00ED565C3A686A39EBCDBFB7ACE3D3B22CD63BB6505970DEA81F043C79D1F0C4C6EE4F629B763C229397C8B8DF9655576C26746E0C25E3386733694B9B433C47159C001721CC11D9353EEA84827A2AFF8EC82C481F2C241A82B75C1E910F612945F60EB6B7E61FD0890E520ED3C584F1DDCE066E7DB0A600EBB71F61D514719553C276FDD8D8B1731BF8D435BE0D029FAF31365F4AE8C4C01E752FFFB700A8286C144A167CF31EF4DADF25141F29998B0DE4ED4E83FA490BEC2B74F2368C82C4AC3F9DE999959473A1C136094C243F3944D47A738EAE09B75B518D9B82EFA5E028E973A8DB27AA14F2509E5D467DA3B2BA53DB8E667B5A3A5EF0A240CA062DDEEC90B4EEEFD9F3F4C7C5AE6A0C96B90734DF65DB45F2C6F2358CDE6268CC742EACF3AD902999E56A6236E67F0FB76DB401C5633DF78CB7C6E5F3CE29EFEBBFF26C46703D97732C4F81F655A5D06554F7FCC4AB1AB35C72FB409FCC8C0C4AEFEBB5C7BCEB3619FAD73B5384988DD21ED3C4263C8D3A7ECCF963921D9B74D13BE98E241A3772397C354DF4539B5082D4DC8BBCD2CED67950516910A55FE44C0AACB73758702D56E07C3D1429DE08A7A31BEDF7B95D9873B93C7CC5FCF2A11EB4F81200D9C46C5602EC4F0D787DCF6D76C7ED5F8A6F9E0D917E76884F67CDC111BD6F42D72A4B68BEC4C56D9D5E3DD19F38BBA7828FD9F08B2DBE0027D63D44F9FDA6212B95D483B636577A655A82B19C6146ADC988FF05789E232BE7160F90671E5F67E05C75D17EE632A0C9A55A427EA56F822F823F770ED4526E87F5C6ECF1F8D505B59B737C53942BF77F9480690A2C016EF49B2064DEE53D9FEA6F1F442990B780FB5587E28706C2ADB71DD2B5D1DF09D4D0770105E8B2296E016F120473373AE5F7F094DCF0FBE23DAC79B66DE7D67E90C307B14B7B7C21F8DA72E51A8CDEBFFC15C2CA9F21AFFE038574340FB80C0000
Ceci est mon exemple de base de données, donc cela ne me dérange pas de le partager.
La colonne est de type varbinary(max)
, j'ai recherché comment la convertir en texte UTF8 * -ish *.
varbinary à chaîne sur SQL Server
SQL Server: convertir une chaîne en chaîne hexadécimale et inverser #sql #sqlserver
For
SELECT CONVERT(VARCHAR(max), 0x1F8B0800000000000400CD57DB6EDB3810..... , 0)
ou encore plus simple
SELECT CONVERT(VARCHAR(max), (SELECT TOP (1) [t0].[Model]FROM [__MigrationHistory] AS [t0]), 0);
J'obtiens le résultat suivant
littéralement ceci: ‹
J'ai vérifié mon Model
s'il n'est pas cassé ou incomplet dans les deux LinqPad5 et en utilisant cet outil trouvé ici , mais ça a l'air ok .
Enfin trouvé cet article:
Ainsi, l'exécution de la requête obtient ce que je voulais, Base64 valide.
Utilisation de XML et de l'indication "pour le chemin xml"
select Model, baze64
from __MigrationHistory
cross apply (select Model as '*' for xml path('')) T (baze64)
D'autres requêtes présentées dans l'article fonctionneront également
Utilisation de XML XQuery
Utilisation de JSON
C'est apparemment gzip'd xml. par exemple
SELECT MigrationId
,ContextKey
,cast(decompress(model) as xml) model
FROM __MigrationHistory
Nécromancement.
Vous pouvez également utiliser pour JSON PATH similaire à la façon dont XML PATH est utilisé:
SELECT
T_AP_Dokumente.DK_UID
,T_AP_Dokumente.DK_Thumbnail
,tBase64.JSON_Thumbnail
,NULLIF(T.XML_Thumbnail, '') AS base64
,COMPRESS(T_AP_Dokumente.DK_Thumbnail) AS gzipped
,DATALENGTH(COMPRESS(T_AP_Dokumente.DK_Thumbnail)) AS dlt_datalength_gzipped
,DATALENGTH(T_AP_Dokumente.DK_Thumbnail) AS dlt_datalength
,DATALENGTH(DECOMPRESS(COMPRESS(T_AP_Dokumente.DK_Thumbnail))) AS should_equal_dlt_datalength
FROM T_AP_Dokumente
CROSS APPLY
(
SELECT T_AP_Dokumente.DK_Thumbnail AS '*' FOR XML PATH('')
) AS T(XML_Thumbnail)
CROSS APPLY
(
SELECT * FROM
OPENJSON
(
(
SELECT T_AP_Dokumente.DK_Thumbnail AS JSON_Thumbnail
FOR JSON PATH
)
) WITH(JSON_Thumbnail varchar(MAX)) AS t
) AS tBase64