我需要通过一个计时器将值传递给一个哈希字节函数。 当我对值进行硬编码和使用参数时,结果是不同的:
- 我尝试过玩VarChar vs nVarChar
- 我尝试过使用 CHAR(13( 和/或 CHAR(10(
- 我已经将FileContent的值复制到记事本和写字板,并且在两者中似乎都是正确的。
--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,
第一个哈希字节,给出这个结果(硬编码(:
0xB1C23ED2F33F723D7C4FF23D4415B983F08E0C6C
第二个哈希字节,给出这个结果(参数(:
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:TempNB00002.TXT'',SINGLE_CLOB) x'
我错过了什么?
根据Microsoft文档和函数 HashBytes :
HASHBYTES ( '<algorithm>', { @input | 'input' } )
<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512
单引号对于算法类型是必需的,SHA1 输出为 160 位/20 字节。输入可以是varchar,nvarchar或varbinary。输出以变量(最大 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 字节。