sql-server - 在 SQL Server 中插入随机数

标签 sql-server stored-procedures

我有下表

create table MBR_IDS
(
    MBR_SLNO int identity(1,1),
    MBR_ID int
)
GO

ALTER TABLE MBR_IDS 
    ADD CONSTRAINT UNIQUE_MBR_ID 
    UNIQUE NONCLUSTERED (MBR_ID)

和下面的存储过程来创建一个随机数

CREATE PROCEDURE USP_RANDOM_6
AS 
BEGIN
    DECLARE @chars NCHAR(36)
    SET @chars = N'0123456789'

    DECLARE @result NCHAR(6)
    SET @result = SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)

    SELECT @result
END
GO

当我通过存储过程插入一个值时:

declare @row int
set @row =1

while (@row <= 1000)
begin
    insert into MBR_IDS 
    values(USP_RANDOM_6)

    set @row = @row + 1
end
GO

我收到这个错误:

enter image description here

最佳答案

一种选择是创建函数而不是存储过程。

您可以通过在表中捕获返回值来对存储过程执行您想要的操作:

create table #retval (val nchar(6));
declare @row int = 1;
while (@row <= 1000)
begin
    truncate table #retval;

    insert into #retval
        exec USP_RANDOM_6;

    insert into MBR_IDS
        select val
        from #retval; 
    set @row=@row + 1
end;

实际上,如果你把它存储在一个表中,你可以把所有的东西都放到一个临时表中,然后只做一次插入:

create table #retval (val nchar(6));
declare @row int = 1;
while (@row <= 1000)
begin
    insert into #retval
        exec USP_RANDOM_6;

    set @row = @row + 1;
end;

insert into MBR_IDS
    select val
    from #retval; 

编辑:

我不知道这个操作哪个更快,存储过程还是函数。但是,我不会使用任何一个。我会简单地做:

declare @row int = 1;
while (@row <= 1000)
begin
    insert into MBR_IDS
        select replace(str(checksum(newid())%1000000, 6, 0), ' ', '0')
    set @row=@row + 1
end;

这使用 newid() 来计算一个新的长字符串。然后它采用 checksum(),它应该是一个随机的 4 字节数字,以一百万为模。剩下的只是对其进行格式化,使其成为一个以“0”为前缀的 6 位字符串。

还有,不知道在上面的构造中引入临时表的时候是怎么想的。更简单的方法是:

declare @row int = 1;
while (@row <= 1000)
begin
    insert into MBR_IDS
        exec USP_RANDOM_6;; 
    set @row=@row + 1
end;

关于sql-server - 在 SQL Server 中插入随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17772083/

相关文章:

SQL Server : use CASE with LIKE

sql - 这个简单的 (Oracle) SQL 存储过程代码有什么问题?

sql-server - 为什么 Entity Framework 将参数作为 DECIMAL(5,0) 传递给使用 NUMERIC(19) 定义的列?

c# - 创建具有动态字段的数据库

sql - T SQL CHECK 允许大写值集的约束

java - 从 Java 类内部调用存储过程并写入控制台?

sql - 在存储过程中使用同名的临时表

java - 如何在catch部分的对象中添加值?

Java 获取输出 CallableStatement JDBC

sql - 从行中获取最大值并连接到另一个表