Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    SQL Server split di un record e riempimento tabella temporanea

    Salve ragazzi, spero di spiegarmi bene e spero anche che qualcuno riesca ad aiutarmi, ho una tabella tabella_1 con una colonna "classificazione" in cui vengono registrati dei record numerici da 01 a 47, divisi da ";" (es. "03;35" oppure "12;23;45").
    A questo punto devo fare uno split su una seconda tabella temporanea Tabella_2_tmp, questa tabella ha 47 colonne rispettivamente ("doc_tipo 1", "doc_tipo 2"..."doc_tipo 47"). a questo punto vi ho detto in pratica tutto, se in classificazione avrò "02;30;23" mi andrà a settare i rispettivi campi "doc_tipo 2", "doc_tipo 30", "doc_tipo 45" di Tabella_2_tmp a 1 altrimenti se il numero in classificazione è "99" staranno di default a 0 o NULL.
    Potete aiutarmi? non sono molto pratico di SQL. Grazie

  2. #2
    47 colonne?? mmmmm te la cavi con un comando SQL dinamico

  3. #3
    Quote Originariamente inviata da optime Visualizza il messaggio
    47 colonne?? mmmmm te la cavi con un comando SQL dinamico
    Non ho proprio idea neanche del codice da inserire

  4. #4
    Ho trovato questa funzione ma non capisco se va bene, non capisco dove inserire i riferimenti alle 2 diverse tabelle per fare la select e la insert qualcuno mi può aiutare a riscriverla per quello che serve a me?

    codice:
    use tempdb
    go
     
    drop table Tabella_2_tmp
    go
     
    CREATE TABLE Tabella_2_tmp(dccl_tipo_1 int,
    dccl_tipo_2 int,
    dccl_tipo_3 int,
    ...................
    dccl_tipo_47 int,
    ) 
    select Classificazione from [dbo].[tabella tabella_1 ]
    
    
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    CREATE FUNCTION [dbo].[colSplit1] 
    ( 
    @InputString VARCHAR(MAX)
    )
    RETURNS 
    @OutputTable TABLE 
    (
    -- Add the column definitions for the TABLE variable here
    Val VARCHAR(MAX)
    )
    AS
    BEGIN
    -- Fill the table variable with the rows for your result set 
    DECLARE @Val VARCHAR(MAX),@Pos INT,@Len INT
    SET @Len = LEN(@InputString)
    
    
    SET @Pos=0
    WHILE (CHARINDEX(';',@InputString,@Pos)-@Pos) > 0
    BEGIN
    
    
    SET @Val = SUBSTRING(@InputString,@Pos,(CHARINDEX(';',@InputString,@Pos)-@Pos))
    
    
    INSERT INTO @OutputTable(Val)
    SELECT @Val 
    SET @Pos = CHARINDEX(';',@InputString,@Pos)+1
    
    
    END
    IF @Pos <= @Len
    BEGIN
    
    
    SET @Val = SUBSTRING(@InputString,@Pos,(@Len+1)-@Pos)
    
    
    INSERT INTO @OutputTable(Val)
    SELECT @Val
    
    
    END
    
    
    RETURN 
    END

  5. #5
    la cosa è abbastanza complessa. la mia paura è che qui non si tratti di 'aiutare' (sei tu stesso a dire che non hai idea di dove mettere le mani) ma di 'fare per tuo conto'.

    questa la teoria

    1. splitti i valori di tab1 in una tab temporanea, una riga per valore
    2. scorri la tab temporanea (va bene anche un cursore)
    3. per ogni riga crei uno statement dinamico di aggiornamento della tab2, e lo esegui

    pochi passi, ma bisogna avere una buona confidenza con sql

  6. #6
    Quote Originariamente inviata da optime Visualizza il messaggio
    la cosa è abbastanza complessa. la mia paura è che qui non si tratti di 'aiutare' (sei tu stesso a dire che non hai idea di dove mettere le mani) ma di 'fare per tuo conto'.

    questa la teoria

    1. splitti i valori di tab1 in una tab temporanea, una riga per valore
    2. scorri la tab temporanea (va bene anche un cursore)
    3. per ogni riga crei uno statement dinamico di aggiornamento della tab2, e lo esegui

    pochi passi, ma bisogna avere una buona confidenza con sql
    Ciò vuol dire che non ci riuscirò mai

  7. #7
    conosci qualche linguaggio di programmazione? altrimenti puoi affidare il lavoro a qualcuno

  8. #8
    Allora ci stò arrivando, ho eliminato l'idea di una tabella temporanea e scrivo direttamente su tabella_2...

    Ho creato una function split

    codice:
    CREATE FUNCTION [dbo].[Split]
    (
        @sString nvarchar(2048),
        @cDelimiter nchar(1)
    )
    RETURNS @tParts TABLE ( part nvarchar(2048) )
    AS
    BEGIN
        if @sString is null return
        declare	@iStart int,
        		@iPos int
        if substring( @sString, 1, 1 ) = @cDelimiter 
        begin
        	set	@iStart = 2
        	insert into @tParts
        	values( null )
        end
        else 
        	set	@iStart = 1
        while 1=1
        begin
        	set	@iPos = charindex( @cDelimiter, @sString, @iStart )
        	if @iPos = 0
        		set	@iPos = len( @sString )+1
        	if @iPos - @iStart > 0			
        		insert into @tParts
        		values	( substring( @sString, @iStart, @iPos-@iStart ))
        	else
        		insert into @tParts
        		values( null )
        	set	@iStart = @iPos+1
        	if @iStart > len( @sString ) 
        		break
        end
        RETURN
    
    
    END
    Ora con un cursore in una stored procedure inserisco i dati splittati in una colonna

    codice:
    USE [ddati]
    GO
    
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    ALTER PROCEDURE [dbo].[typedef]
      ( @Params varchar(300), 
        @Delimiter varchar(1))
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
    
       declare 
          @type  varchar(5),
          @upd_sql  varchar(255)
    	
    
    
       declare CUR Cursor for
        select *  from [dbo].[Split](@Params,@Delimiter)
    
    
      set @upd_sql = 
    
    
      
       
    
    
    
    
    	OPEN CUR 
    	Fetch Next From CUR Into @type
        While @@Fetch_Status = 0 Begin
    
    
    
    
    		Fetch Next From CUR Into @type
    	End -- End of Fetch
    
    
    
    
        -- Insert statements for procedure here
    END
    ora provando a mano mi da questo risultato

    codice:
    exec Typedef "10;42;16", ';'
    
    
    part
    1 10
    2 42
    3 16
    Ora l'ultima parte, ho già fatto gran parte del lavoro....

    Devo fare in modo che quel 10 mi setti a 1 il docu_tipo10, il 42 mi setti a 1 docu_tipo42 sulla tabella_2. Puoi consigliarmi? ti prego scrivimi una parte di codice...

  9. #9
    qualcosa del tipo

    set@upd_sql= 'UPDATE tabella SET ' & @variabile_colonna_letta_dal_cursore & ' = 1'
    exec
    @upd_sql


  10. #10
    Quote Originariamente inviata da optime Visualizza il messaggio
    qualcosa del tipo

    set@upd_sql= 'UPDATE tabella SET ' & @variabile_colonna_letta_dal_cursore & ' = 1'
    exec
    @upd_sql

    No non ho capito, con questo aggiorno la tabella_2 e setto a 1 se trovo 02 non setto niente... e l'exec come funziona?
    Io stavo pensado di utilizzare CASE ad es:

    codice:
    set @upd_sql=
    
    
    CASE Cursor_Typedef
    WHEN 01 THEN 'UPDATE Tabella_2 SET dccl_tipo_1 = 1' 
    WHEN 02 THEN 'UPDATE Tabella_2 SET dccl_tipo_2 = 1'
    WHEN 03 THEN 'UPDATE Tabella_2 SET dccl_tipo_3 = 1'
    ....
    WHEN 47 THEN 'UPDATE Tabella_2 SET dccl_tipo_47 = 1'
    ELSE 
    Ma non ho la più pallida idea della sintassi puoi darmi una mano?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.