Tsql 此代码未设置某些值
因此,我正在为tsql编写一些程序,以使一个组项目重新启动,并尝试编写一些程序来创建带有附加密码的用户配置文件。但是,当我运行这段代码时,@seedno和@saltval的值从未设置过,因此我的哈希密码以空值结束。有人能帮忙吗Tsql 此代码未设置某些值,tsql,Tsql,因此,我正在为tsql编写一些程序,以使一个组项目重新启动,并尝试编写一些程序来创建带有附加密码的用户配置文件。但是,当我运行这段代码时,@seedno和@saltval的值从未设置过,因此我的哈希密码以空值结束。有人能帮忙吗 CREATE PROCEDURE [dbo].[CreateCustomerAccount] @companyName nvarchar (50), @emailAddress nvarchar(50), @password nvarchar (1
CREATE PROCEDURE [dbo].[CreateCustomerAccount]
@companyName nvarchar (50),
@emailAddress nvarchar(50),
@password nvarchar (100),
@Addr1 nvarchar (50),
@Addr2 nvarchar (50),
@Addr3 nvarchar (50),
@postCode nvarchar (11),
@Telephone NVARCHAR (20),
@vatNo NVARCHAR (20)
AS
SET NOCOUNT ON
--Declare some variables here
DECLARE
@pwdSalt NVARCHAR (25),
@Seed INT, /* this is going to store the randomly generated seed we will use to make the salt */
@CurrentChar CHAR,
@SaltedPwd NVARCHAR (125),
@LoopCountVar TINYINT, /*because counting is fun, kids :). */
@Seedno integer,
@saltval CHAR
--Generate a seed using the customers email address and a psuedo random number generator.
SET @LoopCountVar = 0;
WHILE @LoopCountVar <= LEN(@emailAddress)
BEGIN
SET @CurrentChar = SUBSTRING(@EmailAddress, @LoopCountVar, 1)
SET @Seedno = (ASCII(@currentChar)*CRYPT_GEN_RANDOM(10000))
SET @Seed = @Seed + @Seedno --Add the integer value of the current character multiplied by a random number between 0 and 100,000 to the seed
SET @LoopCountVar = @LoopCountVar+1
END;
--Now, populate our salt string by inserting random characters using the seed we just created.
SET @LoopCountVar = 0;
while @loopCountVar <= 25
BEGIN
SET @saltval = CHAR (ROUND((RAND()*94)+32,3))
SET @pwdSalt = @pwdSalt + @saltval
SET @LoopCountVar = @LoopCountVar+1
END;
--Time for delicious delicious salted hash
Set @SaltedPwd = @pwdSalt+@password;
-- Insert data into table
Insert into Customer (orgName, Email, AccountPwd, PwdSalt, AddressLine1, AddressLine2, AddressLine3, PostCode, TelephoneNo, VATNo)
VALUES (@companyName, @emailAddress, HASHBYTES('MD5', @SaltedPwd), @pwdSalt, @Addr1, @Addr2, @Addr3, @postCode, @Telephone, @vatNo);
RETURN 0
CREATE过程[dbo].[CreateCustomerAccount]
@公司名称nvarchar(50),
@电子邮件地址nvarchar(50),
@密码nvarchar(100),
@地址1 nvarchar(50),
@添加R2 nvarchar(50),
@地址3 nvarchar(50),
@邮政编码nvarchar(11),
@电话NVARCHAR(20),
@vatNo NVARCHAR(20)
作为
不计较
--在这里声明一些变量
声明
@pwdSalt NVARCHAR(25),
@Seed INT,/*这将存储我们将用于制作盐的随机生成的种子*/
@CurrentChar,
@SaltedPwd NVARCHAR(125),
@LoopCountVar TINYINT,/*因为计数很有趣,孩子们:)*/
@没有整数,
@萨特瓦尔煤焦
--使用客户电子邮件地址和psuedo随机数生成器生成种子。
设置@LoopCountVar=0;
而@LoopCountVar你有几件事要解决。
首先,您尝试将ASCII()
函数返回值(一个INT
)乘以VARBINARY(80)
,后者是CRYPT\u GEN\u RANDOM()函数的返回类型
其次,您正在调用参数长度大于8000的CRYPT\u GEN\u RANDOM(10000)
,这是此函数可以使用的最大长度
看一看和链接。
通常,在进行任何计算之前,您可以一步一步地调试存储过程体,选择其中的变量值。生成pwd的方法似乎非常迂回。
无论如何,在第二个循环中,您使用了一个未赋值变量,这使得结果为空
试试这个:
SET @LoopCountVar = 0;
SET @pwdSalt=''
while @loopCountVar <= 25
BEGIN
SET @saltval = CHAR (ROUND((RAND()*94)+32,3))
SET @pwdSalt = @pwdSalt + @saltval
SET @LoopCountVar = @LoopCountVar+1
END;
SET@LoopCountVar=0;
设置@pwdSalt=''
虽然@loopCountVar很好,因为从未使用过seed,但是第一个循环似乎是在浪费精力。这很好,当前版本在第二个循环中使用@seed。我在某个时候忘记了。我将行更改为SET@Seedno=(ASCII(@currentChar)*CAST(CRYPT\u GEN\u RANDOM(2)AS INT))
…它抛出Msg 8152,级别16,状态13,过程CreateCustomerAccount,第62行字符串或二进制数据将被截断。声明已终止。对不起,双重邮寄。我以前没有用过这个,我正在努力适应它。这是在你做了我提到的更正之后吗?设置在循环之前分配@pwdsalt?无论如何,尝试插入时似乎会出现错误。检查要插入到的表的模式,并检查所有的varchar是否足够大以容纳插入的值。顺便问一下,您的第二个循环运行了26次,这是故意的吗?将限制设置为@loopCountVar<25,以在25次循环后停止