Welcome to Sign in | Help
in Search

lucru cu stringuri in T-SQL

Last post 03-13-2009, 11:41 AM by Diana. 8 replies.
Sort Posts: Previous Next
  •  03-12-2009, 2:54 PM 6892

    lucru cu stringuri in T-SQL

    Salut,
    Am o problema care nu stiu cum sa o rezolv cat mai simplu.

    Vreau sa imi fac o procedura care sa imi genereze 200.000 de stringuri fiecare dintre acestea fiind facut ca si o concatenare dintre 5 stringuri selectate random dintr-o lista de genul @LISTA separate printr-un singur spatiu. EXEMPLU:
    DECLARE @LISTA AS VARCHAR(MAX);
    SET @LISTA ='almond,antique,aquamarine,azure,beige,bisque,black,blanched,blue,blush,brown,burlywood,burnished,
    chartreuse,chiffon,chocolate,coral,cornflower,cornsilk,cream,cyan,dark,deep,dim,dodger,drab,firebrick,floral,forest,
    frosted,gainsboro,ghost,goldenrod,green,grey,honeydew,hot,indian,ivory,khaki,lace,lavender,lawn,lemon,light,lime,linen,
    magenta,maroon,medium,metallic,midnight,mint,misty,moccasin,navajo,navy,olive,orange,orchid,pale,papaya,peach,peru,pink,
    plum,powder,puff,purple,red,rose,rosy,royal,saddle,salmon,sandy,seashell,sienna,sky,slate,smoke,snow,spring,steel,tan,
    thistle,tomato,turquoise,violet,wheat,white,yellow';

    dupa asta intr-un while de la 1 la 200.000 vreau sa fac stringurile acelea.

    Daca primele 5 numere random alese intre 1 si numarul de cuvinte din @LISTA sunt 1,2,3,4,5 atunci stringul rezultat este
    @REZ = 'almond antique aquamarine azure beige'
    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  03-12-2009, 6:42 PM 6893 in reply to 6892

    Re: lucru cu stringuri in T-SQL

    Daca lucrezi cu SQL 2005, incearca o functie CLR.
  •  03-12-2009, 6:50 PM 6894 in reply to 6893

    Re: lucru cu stringuri in T-SQL

  •  03-12-2009, 7:05 PM 6895 in reply to 6892

    Re: lucru cu stringuri in T-SQL

    poate te ajuta random number generator ...

    http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  03-12-2009, 7:36 PM 6896 in reply to 6892

    Re: lucru cu stringuri in T-SQL

    Insereaza 200.000 de recorduri intr-o tabela si lucreaza cu tabela. SQL este pentru table, nu pentru stringuri.

    http://rusanu.com
  •  03-12-2009, 8:28 PM 6897 in reply to 6892

    Re: lucru cu stringuri in T-SQL

    Folosind una dintre funcţiile din articolul menţionat de Diana, putem introduce cele 92 de culori într-o tabelă:

    CREATE FUNCTION iter_charlist_to_tbl

                     (@list      nvarchar(MAX),

                      @delimiter nchar(1) = N',')

          RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL,

                              str     varchar(4000)      NOT NULL,

                              nstr    nvarchar(2000)     NOT NULL) AS

     

    BEGIN

       DECLARE @endpos   int,

               @startpos int,

               @textpos  int,

               @chunklen smallint,

               @tmpstr   nvarchar(4000),

               @leftover nvarchar(4000),

               @tmpval   nvarchar(4000)

     

       SET @textpos = 1

       SET @leftover = ''

       WHILE @textpos <= datalength(@list) / 2

       BEGIN

          SET @chunklen = 4000 - datalength(@leftover) / 2

          SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen)

          SET @textpos = @textpos + @chunklen

     

          SET @startpos = 0

          SET @endpos = charindex(@delimiter COLLATE Slovenian_BIN2, @tmpstr)

     

          WHILE @endpos > 0

          BEGIN

             SET @tmpval = ltrim(rtrim(substring(@tmpstr, @startpos + 1,

                                                 @endpos - @startpos - 1)))

             INSERT @tbl (str, nstr) VALUES(@tmpval, @tmpval)

             SET @startpos = @endpos

             SET @endpos = charindex(@delimiter COLLATE Slovenian_BIN2,

                                     @tmpstr, @startpos + 1)

          END

     

          SET @leftover = right(@tmpstr, datalength(@tmpstr) / 2 - @startpos)

       END

     

       INSERT @tbl(str, nstr)

          VALUES (ltrim(rtrim(@leftover)), ltrim(rtrim(@leftover)))

       RETURN

    END

     

    GO

    CREATE TABLE Culori (

          ID int PRIMARY KEY,

          Culoare varchar(20) NOT NULL UNIQUE

    )

     

    GO

    DECLARE @LISTA AS VARCHAR(MAX);

    SET @LISTA ='almond,antique,aquamarine,azure,beige,bisque,black,blanched,blue,blush,brown,burlywood,burnished,chartreuse,chiffon,chocolate,coral,cornflower,cornsilk,cream,cyan,dark,deep,dim,dodger,drab,firebrick,floral,forest,frosted,gainsboro,ghost,goldenrod,green,grey,honeydew,hot,indian,ivory,khaki,lace,lavender,lawn,lemon,light,lime,linen,magenta,maroon,medium,metallic,midnight,mint,misty,moccasin,navajo,navy,olive,orange,orchid,pale,papaya,peach,peru,pink,plum,powder,puff,purple,red,rose,rosy,royal,saddle,salmon,sandy,seashell,sienna,sky,slate,smoke,snow,spring,steel,tan,thistle,tomato,turquoise,violet,wheat,white,yellow';

     

    INSERT INTO Culori (ID, Culoare)

    SELECT listpos, str FROM dbo.iter_charlist_to_tbl(@Lista, ',')

     

    GO

     

    Apoi, putem genera cele 200.000 de combinaţii astfel:

    CREATE TABLE Combinatii (

          ID int IDENTITY PRIMARY KEY,

          Combinatie varchar(104) NOT NULL

    )

     

    GO

    SET NOCOUNT ON

     

    DECLARE @N INT

    SET @N=200000

     

    WHILE @N>0 BEGIN

          INSERT INTO Combinatii (Combinatie)

    /*    SELECT Culoare1+' '+Culoare2+' '+Culoare3+' '+Culoare4+' '+Culoare5

          FROM (SELECT TOP 1 Culoare  AS Culoare1 FROM Culori ORDER BY NEWID()) Q1

          CROSS JOIN (SELECT TOP 1 Culoare AS Culoare2 FROM Culori ORDER BY NEWID()) Q2

          CROSS JOIN (SELECT TOP 1 Culoare AS Culoare3 FROM Culori ORDER BY NEWID()) Q3

          CROSS JOIN (SELECT TOP 1 Culoare AS Culoare4 FROM Culori ORDER BY NEWID()) Q4

          CROSS JOIN (SELECT TOP 1 Culoare AS Culoare5 FROM Culori ORDER BY NEWID()) Q5

    */

          SELECT CONVERT(varchar(104), (

                SELECT TOP 5 Culoare+' ' AS "*" FROM Culori ORDER BY NEWID() FOR XML PATH (''), TYPE

          ))

     

          SET @N=@N-1

    END

     

    SET NOCOUNT OFF

     

    GO

    SELECT * FROM Combinatii

     

     

    Probabil va dura cam un minut execuţia acestui cod (pentru a genera 200.000 de combinaţii).

    Răzvan

  •  03-13-2009, 10:03 AM 6899 in reply to 6897

    Re: lucru cu stringuri in T-SQL

    Multumesc mult :).
    Este exact ce imi trebuia.

    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  03-13-2009, 10:04 AM 6900 in reply to 6896

    Re: lucru cu stringuri in T-SQL

    Stiu faptul ca SQL este pentru lucrul cu tabele, dar cateodata ar tre sa ai posibilitatea sa faci putin mai mult cu el.
    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  03-13-2009, 11:41 AM 6902 in reply to 6900

    Re: lucru cu stringuri in T-SQL

    cretzu:
    Stiu faptul ca SQL este pentru lucrul cu tabele, dar cateodata ar tre sa ai posibilitatea sa faci putin mai mult cu el.

    E drept ca poti sa faci "mai mult" cu SQL, dar nu intotdeauna este cel mai bine. In ce priveste lucrul cu sirurile, .NET / C# este o alegere mai buna...

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems