Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    MSSQL insert multipli in base a risultato select

    Ciao,
    devo fare delle insert in una tabella, ma devo farlo in base ai risultati di due select, mi spiego:

    ho quattro tabelle:
    USER (lista utenti)
    LINGUE (lista linugue)
    AZIENDE (lista aziende)
    ASSOCIAZIONI (collegamenti utente, lingua, azienda)

    le prime tre tabelle sono già popolate, io devo fare delle insert sulla quarta (ASSOCIAZIONI):
    l'user è uno solo (e conosco già il suo id che è 999);
    lla tabella LINGUE può contenere uno o più record;
    lla tabella AZIENDE può contenere uno o più record;

    nelle tabelle LINGUE e AZIENDE potrei avere ad esempio ho i seguenti dati:
    LINGUE.record1: ITA
    LINGUE.record2: ENG
    AZIENDE.record1: 001
    AZIENDE.record2: 002

    ora, nei campi USERID, LINGUA e AZIENDA, devo inserire questi dati:
    ASSOCIAZIONI.record1: 999, ITA, 001
    ASSOCIAZIONI.record2: 999, ITA, 002
    ASSOCIAZIONI.record3: 999, ENG, 001
    ASSOCIAZIONI.record4: 999, ENG, 002

    in sostanza, per ogni lingua e per ogni azienda devo inserire un record per l'user 999.

    Posso fare tutto con uno script sql che contenga le due iterazioni in base alle select sulle tabelle LINGUE e AZIENDE?

    Spero di essere stato chiaro... :master:

  2. #2
    si, con i cursori che in sql server ti consentono di iterare fra i record di una o più tabelle.
    L'unica cosa che non ho capito è se questa insert ti serve una tantum oppure deve scatenarsi in base a qualche operazione di Insert/Update/Delete su una delle quattro tabelle.
    Se fosse il secondo caso, allora avresti bisogno di un trigger, da far scattare appunto su una delle tabelle in base ad una o tutte le tre operazioni di I/U/D, che abbia l'implementazione del cursore al suo interno.

    Inizia a chiarire questi aspetti e dai un'occhiata alla pagina MSDN (o technet) dedicata ai cursori sql server: ricordo che ci sono esempi veramente ben fatti che ti faranno subito capire come e quando utilizzarli.

  3. #3
    E' un'operazione che devo fare una sola volta su tutti i database presenti in MSSQL.
    Grazie per i chiarimenti, vado subito a vedere...
    Ciao

  4. #4
    Solo una cosa, se ti capitano per le mani un paio di link utili me li posti?
    In rete sto facendo un po' di fatica a trovare materiale chiaro...
    Grazie

  5. #5
    Ok, ho trovato il materiale giusto e sono riuscito a fare tutto.
    Grazie per le dritte

  6. #6
    Ora ho un problema:
    sono riuscito a fare quello che ho descritto nel primo messaggio su un database, praticamente se lancio questa query su un qualsiasi database funziona tutto.
    Il mio scopo finale però è quello di lanciare questa query su tutti i database presenti nella mia istanza mssql.
    Ho provato ad includere questo script in un ulteriore cursore che recupera la lista di database e salva il risultato nella variavile @database:

    DECLARE CursoreDatabase CURSOR FOR
    SELECT name
    FROM sys.databases
    WHERE database_id > 4

    il problema è che poi devo specificare il database nell'altro cursore:

    DECLARE CursoreProcedura CURSOR FOR
    SELECT idprocedrf
    FROM @database.dbo.zctg_procedure

    e qui mi da errore alla righa FROM '@database.dbo.zctg_procedure'

    idee su come aggirare il problema?

  7. #7
    E qui son dolori forse!
    Nel senso che sarebbe un po' come l'eterna storia del voler creare delle stored procedure la cui clausola where si possa adattare ai parametri passati dall'utente. In quel caso si risolve mediante concatenazione di stringhe quindi "SELECT * FROM Tabella WHERE " + p1 + " AND " + p2 ecc ecc e non si può risolvere, che io sappia, con SELECT * FROM TABELLA WHERE @p1 AND @p2.
    Nel tuo caso, forse, potresti provare a crearti e lanciare una stored per effettuare l'operazione di select.

  8. #8
    Capisco,
    il problema però è che questa select (che deve contenere la variabile valorizzata con il nome del database) non è nelle istruzioni del cursore tra begin/end ma nella dichiarazone del cursore...

  9. #9
    Credo di aver trovato una soluzione:

    tengo lo script che funziona su singolo database, recupero la lista di tutti i database e ogni volta lanco un 'USE DATABASE @database'...



    neanche USE @database viene accettato...

    RIEPILOGO
    ecco quello che eseguo:

    codice:
    DECLARE @database varchar(50)
    
    DECLARE CursoreDatabase CURSOR FOR
    	SELECT name
    	FROM sys.databases
    	WHERE database_id > 4
    	ORDER BY name
    
    OPEN CursoreDatabase
    
    /* recupera i valori e li mette nella variabile */
    FETCH NEXT FROM CursoreDatabase INTO @database
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	/* inizio istruzioni da eseguire */
    	USE @database
    	SELECT name FROM user WHERE code = 1
    
    	/* fine istruzioni da eseguire */
    
    	FETCH NEXT FROM CursoreDatabase INTO @database
    END
    
    CLOSE CursoreDatabase
    
    DEALLOCATE CursoreDatabase
    in questo modo vorrei ottenere il risultato della select per tutti i database, ma mi da errore Sintassi non corretta in prossimità di '@database'. sull riga 'USE @database'

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    363
    Al posto di:
    USE @database
    SELECT name FROM user WHERE code = 1

    devi mettere:
    EXEC('USE ' + @database + ';SELECT name FROM user WHERE code = 1');

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