【问题标题】:SQL Query return different result for parameter vs hardcoded value passed to HashBytes FunctionSQL Query 为传递给 HashBytes 函数的参数与硬编码值返回不同的结果
【发布时间】:2019-08-07 08:14:29
【问题描述】:

我需要通过参数将值传递给 HashBytes 函数。当我对值进行硬编码时,当我使用参数时,结果会有所不同:

  • 我尝试过使用 VarChar 与 nVarChar
  • 我尝试过使用 CHAR(13) 和/或 CHAR(10)
  • 我已将 FileContents 的值复制到记事本和写字板中,这两者似乎都是正确的。
--Read the values from the database into a parameter
DECLARE @FileContents  NVARCHAR(MAX)
DECLARE @TableContents  table (TXT NVARCHAR(250))
insert into @TableContents (TXT) select TXT_0 from ZFICFIL
select * from @TableContents   -- Table contents

set @FileContents = ''
SELECT @FileContents = @FileContents + char(13) + TXT FROM @TableContents
-- Drop the first CR/LF
select @FileContents = right(@FileContents, len(@FileContents)-1)
select @FileContents

DECLARE @HashThis nvarchar(MAX);  
SET @HashThis = CONVERT(nvarchar(MAX),'ZAPAY190800101000001,07/02/2019 14:46:24 PM
2,300,');  
SELECT HASHBYTES('SHA1', @HashThis)
SELECT HASHBYTES('SHA1', @FileContents)

表格内容如下:

ZAPAY190800101000001,07/02/2019 14:46:24 PM
2,300,

@FileContents 给出了这个:

ZAPAY190800101000001,07/02/2019 14:46:24 PM
2,300,

这第一个HashBytes,给出这个结果(硬编码):

0xB1C23ED2F33F723D7C4FF23D4415B983F08E0C6C

这第二个HashBytes,给出这个结果(参数):

0x6A8C526D7BCD7BEA5789B53D526B8D5C77173EA2

如果我没有从表格中读取,而是将其“硬编码”如下,那么它可以工作:

set @FileContents = 'ZAPAY190800101000001,07/02/2019 14:46:24 PM'
set @FileContents = @FileContents + CHAR(13) + CHAR(10) + '2,300,'

我尝试将值放入文件中并从文件中读取,但这也不起作用。

set @FileContents = 'SELECT convert(varchar(MAX), *) FROM OPENROWSET(BULK ''C:\Temp\NB00002.TXT'',SINGLE_CLOB) x'

我错过了什么?

【问题讨论】:

  • MYSQL 没有 nvarchar 或 + 作为连接快捷方式 - 你确定这是一个 mysql 问题吗?

标签: sql parameters varchar hashbytes


【解决方案1】:

根据微软文档和HashBytes函数:

HASHBYTES ( '<algorithm>', { @input | 'input' } )  
<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512

算法类型必须使用单引号,SHA1 输出为 160 位/20 字节。输入可以是 varchar、nvarchar 或 varbinary。输出作为 varbinary(Max 8000) 返回。 对于 SQL 2014(12.x) 及更早版本,最大输入限制为 8000 字节。

例子:

DECLARE @HashThis nvarchar(32);  
SET @HashThis = CONVERT(nvarchar(32),'dslfdkjLK85kldhnv$n000#knf');  
SELECT HASHBYTES('SHA2_256', @HashThis);

*SQL 2016 及更高版本已弃用 SHS 和 SHA1。考虑使用校验和或 binary_Checksum;同样对于 SQL 2014 及更早版本,最大输入为 8000 字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多