Visualizzazione dei risultati da 1 a 10 su 10

Discussione: query update sql

  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881

    query update sql

    ho tre tabelle: una testa, una righe e una tratte
    La righe contiene il riferimento a un record della tabella tratte e ad un record della tabella teste. A un record delle teste possono corrispondere più record delle righe, mentre ad ogni record delle righe corrisponde un unico record delle tratte

    Nella teste devo aggiornare un campo che contiene la somma dei km indicati nella tratte legati alle righe di ogni singola testa... forse si comprende meglio da qui: devo fare più o meno questo

    update tbl_teste
    set kmtot = (select SUM(ISNULL(tbl_tratte.km,0)) as totkm from tbl_righe
    left join tbl_tratte ON tbl_righe.IDtratta = tbl_tratte.ID
    where tbl_righe.IDtesta = tbl_teste.ID)

    ... solo che devo scriverlo in modo che piaccia anche a SQL 2008r2.
    Mi aiutate?
    Grazie
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Hai provato a vedere se puoi usare una funzione?

    update tbl_teste
    set kmtot = calcola_km(param1,...,parmN);
    where .....

    Saluti.

  3. #3
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    capisco cosa mi dici di fare ma non so come si programmano funzioni in sql
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Una soluzione c'è:studiare.Io non conosco il database che usi che penso sia SQL Server di Microsoft.SAluti.

  5. #5
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    SQL, manca che lo scriva solo nella firma e poi l'ho messo dappertutto.
    Scopro da te che si possono programmare funzioni in SQL del tipo
    function (param1, param2) as integer
    ...
    end function

    ... sei sicuro che si possa fare? Va fatta prima della select in cui la utilizzo, suppongo. Dove trovo documentazione? Trovo solo guide sul linguaggio ma non esempi di funzioni come quelle che suggerisci.
    Mi manca proprio l'avvio poi mi arrangio.
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  6. #6
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    ecco ho trovato qui qualcosa (mi si sta aprendo un mondo) http://www.programmazione.it/index.p...m&idItem=43004
    Però ho interpretato (con grande uso della fantasia) per fare il porting al mio caso e ci sarà sicuramente qualche chapel in mezzo...

    codice:
        CREATE FUNCTION dbo.totkm
          (@idtesta integer)
        RETURNS integer AS
        BEGIN
          SELECT SUM(IsNull(tbl_tratte.km,0)) FROM tbl_righe LEFT JOIN tbl_tratte ON tbl_righe.IDtratta = tbl_tratte.ID WHERE tbl_righe.IDtesta = @idtesta
          RETURN
        END
        
       
         
        UPDATE tbl_teste SET kmtot = totkm(tbl_teste.ID)
        
        GO
    questo dovrebbe fare l'update di tutti i record di tbl_teste inserendo nel campo kmtot il risultato della funzione totkm a cui passo come parametro l'id del record che sto aggiornando.... corretto?
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  7. #7
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    evitare di perdere una mattina per capire che non si può creare una funzione e usarla nello stesso contesto è una di quelle cose che ti aspetti che un forum ti aiuti a fare, e naturalmente invece....

    comunque credo (spero) di aver raggiunto un risultato. Questa è la creazione della funzione:
    codice:
     use [nomedb]
     go
     
    	IF OBJECT_ID (N'dbo.totkm', N'FN') IS NOT NULL
    		DROP FUNCTION dbo.totkm;
    	GO
    	
        CREATE FUNCTION dbo.totkm ( @idtesta int )
    		RETURNS int
    		WITH EXECUTE AS CALLER
    		BEGIN
    		 RETURN (SELECT SUM(IsNull(tbl_tratte.km,0)) FROM tbl_righe LEFT JOIN tbl_tratte ON tbl_righe.IDtratta = tbl_tratte.ID WHERE tbl_righe.IDtesta = @idtesta) ;
    		  
        END
    e così la uso (e poi la distruggo)
    codice:
      UPDATE tbl_teste SET kmtot = dbo.totkm(tbl_teste.ID)
        
        GO
        
        IF OBJECT_ID (N'dbo.totkm', N'FN') IS NOT NULL
    		DROP FUNCTION dbo.totkm;
    	GO
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Il mio suggerimento è una possibile strada.Poi dipende cosa devi fare.Se per esempio devi aggiornare una tabella ogni volta che viene inserita una riga devi usare un trigger.La mia prima soluzione è possibile su MySql.Tu quale dbms usi?Inoltre,la mia soluzione la puoi usare anche prima della select memorizzando il risultato in una variabile e poi usarla nella select.Le strade sono tante tocca a te,in base al progetto che stai sviluppando, decidere come procedere.

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    ecco, ora mi resta da chiarire solo perchè non mi permette di usare la funzione!
    Il management studio mi dice "impossibile trovare la colonna dbo oppure l'aggregazione o la funzione definita dall'utente dbo.totkm oppure il nome è ambiguo".... dovrebbe essere l'errore 4121


    E' SQL 2008r2, devo aggiornare dei dati su una tabella una tantum, non lo farò mai più (giuro).
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  10. #10
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    suggerimenti per l'errore?
    Non riesco ad avviare la funzione, l'ha creata, la vedo tra le funzioni a valori scalari ma richiamata in quel modo mi mostra quel messaggio dell'errore 4121
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

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 © 2026 vBulletin Solutions, Inc. All rights reserved.