如何在INSERT INTO语句中使用函数[SQL SERVR 2016]

时间:2017-07-14 16:49:24

标签: sql-server function call scalar

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

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

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

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

  2. 创建一个 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
    
  3. 现在我想在INSERT INTO条款中使用名为'WordGenerator'的这个FUNCTION,但它根本无效,因为我无法调用它。

  4. 如何调用我的函数每次应该生成一个新的随机单词?

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

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

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

    有什么想法吗?

1 个答案:

答案 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();这样你就可以调用表值函数。