我有下表
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
我收到这个错误:
最佳答案
一种选择是创建函数而不是存储过程。
您可以通过在表中捕获返回值来对存储过程执行您想要的操作:
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/