标题说明了一切。我需要创建一个表(ID,FirstName,LastName),该表将填充随机生成的“单词”,这些单词具有随机长度并且是从我的“字母”创建的。每个单词都需要由DB随机生成。整个表应该有1,000,000行。
让我告诉你到目前为止我所做的事情。
创建一个生成随机数的 VIEW :
CREATE VIEW [dbo].[RANDOM]
AS SELECT RAND() RandomResult
创建一个 SCALAR FUNCTION ,从确定的'字母'集合中生成一个随机长度'word':
CREATE FUNCTION [dbo].[WordGenerator] (@RandomWord VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @Alphabet VARCHAR(33) = 'abcdefghijklmnoprstuówxyzęąśłżźćń',
@StrLength INT,
@LoopCount INT,
@RandomString VARCHAR(MAX),
@AlphabetLength INT;
SELECT @StrLength = (SELECT RandomResult FROM dbo.Random) * 4 + 7, @LoopCount = 0, @RandomString = '', @AlphabetLength = LEN(@Alphabet);
WHILE (@LoopCount < @StrLength)
BEGIN
SELECT @RandomString = @RandomString + SUBSTRING(@Alphabet, CONVERT(INT, (SELECT RandomResult FROM dbo.Random) * @AlphabetLength), 1)
SET @LoopCount = @LoopCount + 1;
END
RETURN @RandomString;
END
现在我想在INSERT INTO条款中使用名为'WordGenerator'的这个FUNCTION,但它根本无效,因为我无法调用它。
如何调用我的函数每次应该生成一个新的随机单词?
使用SELECT TOP 1 RandomWord FROM dbo.WordGenerator()
不起作用。
使用SELECT dbo.WordGenerator()
不起作用。
使用SELECT * FROM dbo.WordGenerator()
不起作用。
有什么想法吗?
答案 0 :(得分:1)
问题是你的函数需要一个从未使用过但未传入的参数。所以将它改为:
CREATE FUNCTION [dbo].[WordGenerator] ()
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Alphabet VARCHAR(33) = 'abcdefghijklmnoprstuówxyzęąśłżźćń',
DECLARE @StrLength INT;
DECLARE @LoopCount INT;
DECLARE @RandomString VARCHAR(MAX);
DECLARE @AlphabetLength INT;
SELECT @StrLength = RandomResult * 4 + 7, @LoopCount = 0, @RandomString = '', @AlphabetLength = LEN(@Alphabet)
FROM dbo.Random;
WHILE @LoopCount < @StrLength
BEGIN
SELECT @RandomString = @RandomString + SUBSTRING(@Alphabet, CONVERT(INT, RandomResult * @AlphabetLength), 1)
FROM dbo.Random;
SET @LoopCount += 1;
END;
RETURN @RandomString;
END;
然后就这样称呼它:SELECT dbo.WordGenerator();
这就是你调用标量函数的方式。
SELECT * FROM dbo.WordGenerator();
这样你就可以调用表值函数。