【问题标题】:How to use Function in the INSERT INTO Statement [SQL SERVR 2016]如何在 INSERT INTO 语句中使用函数 [SQL SERVER 2016]
【发布时间】:2017-12-19 20:29:31
【问题描述】:

标题说明了一切。我需要创建一个表(ID,FirstName,LastName),该表将填充随机生成的“单词”,这些“单词”具有随机长度,并且是从我的“字母表”创建的。每个单词都需要由 DB 随机生成。整个表应该有 1,000,000 行。

让我来告诉你我到目前为止所做的事情。

  1. 创建了一个生成随机数的VIEW

    CREATE VIEW [dbo].[RANDOM] AS SELECT RAND() RandomResult

  2. 创建了一个 SCALAR FUNCTION,它从一组确定的“字母”中生成一个随机长度的“单词”:

      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
    
  3. 现在我想在 INSERT INTO 子句中使用这个名为“WordGenerator”的函数,但它根本不起作用,因为我无法调用它。

我怎样才能调用我的函数,它每次都应该生成一个新的随机词?

使用SELECT TOP 1 RandomWord FROM dbo.WordGenerator() 不起作用。

使用SELECT dbo.WordGenerator() 不起作用。

使用SELECT * FROM dbo.WordGenerator() 不起作用。

有什么想法吗?

【问题讨论】:

  • 它不是表值函数。所以只需调用 SELECT dbo.WordGenerator()... 不知道为什么你有一个参数。

标签: sql-server function call scalar


【解决方案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(); 这样你就调用了表值函数。

【讨论】:

  • 你成功了!我从来没有想过。它现在有效,我可以调用它!谢谢!
  • 很高兴我能帮上忙! :)
  • 请接受@Evaldas 的回答。这将有助于确保所有其他人不要查看此问题,因为他已经提供了一个:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多