Invoke-Sqlcmd读取SQL查询哈希返回System.Byte[]的问题求助
解决query_hash字节数组转换为可读哈希值的问题
方法一:在SQL查询中直接转换(推荐)
直接修改你的SQL查询语句,把二进制类型的query_hash转换为十六进制字符串,这样PowerShell获取到的就是直接可用的文本值,和SSMS里显示的格式一致:
SELECT -- 转换query_hash为不带0x前缀的十六进制字符串 CONVERT(VARCHAR(32), query_hash, 2) AS query_hash, -- 保留你需要的其他字段 sql_text, duration, start_time FROM sys.query_store_query -- 或你的目标表 WHERE -- 你的慢查询过滤条件
参数2是CONVERT函数的样式,指定返回无0x前缀的大写十六进制字符串;如果需要带0x前缀,把参数改成1即可。
方法二:在PowerShell中处理字节数组
如果无法修改SQL查询,可以在PowerShell里将字节数组转换为十六进制字符串,再导出CSV:
# 先执行查询获取原始结果 $queryResult = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $SQLDatabase -InputFile $SQLQueryPath -Username $SQLUser -Password $SQLPassword -ConnectionTimeout 60 # 处理query_hash字段,将字节数组转为十六进制字符串 $processedData = $queryResult | ForEach-Object { # 遍历字节数组,每个字节转为两位十六进制字符后拼接 $readableHash = ($_.query_hash | ForEach-Object { $_.ToString("X2") }) -join "" # 生成新对象,替换query_hash字段 $_ | Select-Object *, @{Name = "query_hash"; Expression = { $readableHash }} -ExcludeProperty query_hash } # 导出处理后的结果到CSV $processedData | Export-Csv $ResultPath -Delimiter "," -NoTypeInformation
注意
你之前尝试的[System.Text.Encoding]::ASCII.GetString()或UTF8.GetString()方法无效,是因为query_hash是二进制哈希值,不是文本的编码字节,直接用文本编码解码会得到乱码或错误结果,必须通过十六进制转换才能得到正确的可读哈希格式。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

