2017-07-14 4 views
0

Le titre dit tout. J'ai besoin de créer une table (ID, FirstName, LastName) qui sera peuplée avec des «mots» générés de manière aléatoire qui ont une longueur aléatoire et sont créés à partir de mon «alphabet». Chaque mot doit être généré de manière aléatoire par la base de données. La table entière devrait avoir 1 000 000 lignes. Permettez-moi de vous remplir dans ce que j'ai fait jusqu'à présent.Comment utiliser la fonction dans la déclaration INSERT INTO [SQL SERVR 2016]

  1. créé un VIEW qui génère un nombre aléatoire:

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

  2. créé un SCALAR FONCTION qui génère un 'mot' lengh hasard dans l'ensemble de déterminées 'lettres' :

    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. Maintenant, je veux utiliser cette fonction appelée 'WordGenerator' dans la clause INSERT INTO mais cela ne fonctionne tout simplement pas parce que je ne suis pas capable de l'appeler.

Comment puis-je appeler ma fonction que chaque fois qu'il est censé générer un nouveau mot au hasard?

L'utilisation de SELECT TOP 1 RandomWord FROM dbo.WordGenerator() ne fonctionne pas. Le SELECT dbo.WordGenerator() ne fonctionne pas.

L'utilisation de SELECT * FROM dbo.WordGenerator() ne fonctionne pas.

Des idées?

+1

Ce n'est pas une fonction table. Il suffit donc d'appeler SELECT dbo.WordGenerator() ... pas sûr pourquoi vous avez un paramètre là-dedans. – pmbAustin

Répondre

1

Le problème est que votre fonction attend un paramètre qui n'a jamais été utilisé et pas passé dans le changement donc à:.

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; 

Et puis il suffit d'appeler comme ça: SELECT dbo.WordGenerator(); C'est la façon dont vous appelez un scalaire fonction. De cette façon, vous appelez des fonctions de table.

+1

Vous l'avez cloué! Je n'y ai jamais pensé. Ça marche maintenant, je peux l'appeler! Merci! – PinkMachine

+0

Content de pouvoir aider! :) –

+0

Veuillez accepter la réponse @Evaldas. Cela aidera à s'assurer que tous les autres ne voient pas cette question car il en a déjà fourni une :-) – Isaiah3015