Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 此代码未设置某些值_Tsql - Fatal编程技术网

Tsql 此代码未设置某些值

Tsql 此代码未设置某些值,tsql,Tsql,因此,我正在为tsql编写一些程序,以使一个组项目重新启动,并尝试编写一些程序来创建带有附加密码的用户配置文件。但是,当我运行这段代码时,@seedno和@saltval的值从未设置过,因此我的哈希密码以空值结束。有人能帮忙吗 CREATE PROCEDURE [dbo].[CreateCustomerAccount] @companyName nvarchar (50), @emailAddress nvarchar(50), @password nvarchar (1

因此,我正在为tsql编写一些程序,以使一个组项目重新启动,并尝试编写一些程序来创建带有附加密码的用户配置文件。但是,当我运行这段代码时,@seedno和@saltval的值从未设置过,因此我的哈希密码以空值结束。有人能帮忙吗

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次循环后停止