[SQL]Richiesta fattibilità

di il
16 risposte

[SQL]Richiesta fattibilità

Buongiorno a tutti, sono nuovissimo del forum e alle prime armi con sql.

volevo chiedervi se è fattibile quello che sto per chiedervi:

siamo sullo stesso server:
ho DB1.schema.tabella
e DB2.schema.tabella

dovrei controllare i campi di DB2.schema.tabella.colonna1 se sono presenti su DB1.schema.tabella.colonna1

se il campo è presente scrivere su DB2.schema.tabella.colonna2 il carattere "S"
se non è presente scrivere su DB2.schema.tabella.colonna2 il carattere "N"

mi piacerebbe si potesse creare un bat da lanciare schedulato oppure una stored procedure.

secondo voi è fattibile?

la select che riesco a fare è questa:
select colonna2 from DB1.schema.tabella AS DB1, DB2.schema.tabella AS DB2 WHERE DB1.colonna1 = DB2.colonna1 COLLATE SQL_Latin1_General_CP1_CI_AS
poi come faccio scrivere in colonna2 'N' o 'S' su DB2?

grazie della vostra consulenza.

16 Risposte

  • Re: [SQL]Richiesta fattibilità

    Definisci cosa intendi con "campo" e con "colonna".

    Cerca sul manuale "UPDATE"
  • Re: [SQL]Richiesta fattibilità

    La colonna si chiama "nome" e il campo(valore) "mario"
    vorrei sapere se mario che è presente in DB2.schema.tabella.colonna1 è presente anche in DB1.schema.tabella.colonna1
    e scrivere in DB2.schema.tabella.colonna2 il carattere 's' o 'N' in base se è presente o no

    ho dato un occhiata a UPDATE ma non so come farlo tutto dentro ad uno script (sono veramente alle prime armi)
  • Re: [SQL]Richiesta fattibilità

    Ho pensato a questa ma non l'ho provata:

    UPDATE DB1.schema.tabella
    SET colonna2 = 'S'
    WHERE colonna1 = ( select primo.colonna1 from DB1.schema.tabella AS primo, DB2.schema.tabella AS secondo WHERE primo.colonna1 = secondo.colonna1 COLLATE SQL_Latin1_General_CP1_CI_AS )

    quanto sono lontano?
  • Re: [SQL]Richiesta fattibilità

    No, ti sei avvicinato molto.
    Ora chiedeti a cosa ti serve la SELECT in questo contesto.
  • Re: [SQL]Richiesta fattibilità

    La select dovrebbe restituirmi tutti i campi di Colonna1 del DB PRIMO che sono uguali ai campi di colonna1 del DB SECONDO.

    ho provato solo la select e funziona

    l'update invece mi dice che la select mi restituisce piu di un valore e non può procedere.

    come faccio fare un ciclo?
  • Re: [SQL]Richiesta fattibilità

    Questo è quello che ho fatto: (sto provando a usare EXCEPT e INTERSECT che ho trovato nel manuale)

    UPDATE DB1.schema.tabella
    SET colonna2 = 'N'
    WHERE colonna1 = ( SELECT colonna1 COLLATE SQL_Latin1_General_CP1_CI_AS FROM DB1.schema.tabella
    EXCEPT
    SELECT colonna1 COLLATE SQL_Latin1_General_CP1_CI_AS FROM DB2.schema.tabella
    )

    ma giustamente mi restituisce l'errore

    Msg 512, Level 16, State 1, Line 1
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    The statement has been terminated.
  • Re: [SQL]Richiesta fattibilità

    Stai complicando la cosa!
    La SELECT non ti serve a niente! L'unica parte utile della select è quella relativa alla selezione: WHERE.
  • Re: [SQL]Richiesta fattibilità

    Salve,
    puoi generare un comando inserito in una stored procedure che confronti il contenuto di tutta la tabella [DB1].[owner].[tabella1] con [DB2].[owner].[tabella2] (magari opportunamente filtrato per altri argomenti qui non indicati e non riportati) ed utilizzare l'istruzione MERGE
    https://docs.microsoft.com/it-it/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

    l'istruzione ti permette di correlare 2 proiezioni ed effettuare la cosidetta operazione di UPSERT, cioe' INSERT oppure UPDATE sul risultato di join...
    i risultati praticabili sono 3:
    - relazione soddisfatta: puoi aggiornare la [Colonna2] al valore "S"
    - relazione NON soddisfatta:
    -- il valore e' presente SOLO in [DB2].[owner].[tabella2]: [Colonna2] sara' valorizzata con "N"
    -- il valore e' presente SOLO in [DB1].[owner].[tabella2]: teoricamente, potresti inserire una nuova riga in [DB2].[owner].[tabella2] con i valori prelevati da [DB1].[owner].[tabella1] e valorizzare [Colonna2] = "S" o altro valore a te meglio rilevante
    (nell'esempio di seguito, questa situazione valorizza [Colonna2] = '?')

    non riesco ad utilizzare i tag code dell'editor in quanto qualora li usi non mi permette di inviare il messaggio

    il codice, inserito preferibilmente in una stored procedure, sara' poi eventualmente anche schedulabile, sia tramite l'Agent di SQL Server, che magari anche tramite lo scheduler nativo di Windows nel caso tu scriva un piccolo file .cmd di esecuzione tramite oSql.exe...

    saluti omnia
    --
    Andrea
    Allegati:
    25298_30a990b86ef85b835eab2c6e825d7a27.jpg
    25298_30a990b86ef85b835eab2c6e825d7a27.jpg
  • Re: [SQL]Richiesta fattibilità

    Probabilmente al motore del forum non piacciono le istruzioni SQL per possibili problemi di SQL Injection?
    saluti omnia
    --
    Andrea
  • Re: [SQL]Richiesta fattibilità

    Grazie asql per il codice,

    dato che sono proprio alle prime armi con sql mi sto studiando anche il merge.

    con questa parte se ho capito bene farei:

    il merge di DB1.owner.tabella1 come target
    e DB2.owner.tabella come source usando solo colonna1

    poi con la parte ON WHEN faccio le mie 2 casistiche MATCH e NOT MATCH per valozzare colonna2 'S' o 'N'

    perche poi alla fine fai un DROP TABLE?
  • Re: [SQL]Richiesta fattibilità

    Cosa ne pensate di questo?
    MERGE INTO [DB1].[owner].[tabella1] AS target
    	USING [DB2].[owner].[tabella1] AS source
    		
    		ON (target.NOME = source.NOME)
    		WHEN MATCHED THEN
    			UPDATE SET target.PRESENTE = 'S'		
    		WHEN NOT MATCHED by source THEN
    			UPDATE SET target.PRESENTE = 'N';
    
    GO
    SELECT NOME, PRESENTE FROM [DB1].[owner].[tabella1]
  • Re: [SQL]Richiesta fattibilità

    Salve,
    [target] e' la tabella di destinazione, cioe' quella che contiene la colonna [Colonna2] che andra' valorizzata a S/N secondo il riscontro che avrai dall'operazione di relazione...
    per il resto "va bene", sempre che NON esista il caso che [source] contenga 1 riga NON presente in [target], in questo caso avrai "un orfano" in quella tabella, che non sara' relazionabile... ovviamente la tua analisi sapra' cosa fare di questa evenienza...

    scusa per i DROP, ma erano parte di uno script piu' corposo e completo, con tutto il DDL e le istruzioni di popolamento nel database tempdb, ma non riesco ad usare i tag di code, perche' se li uso mi butta fuori e non inserisce il messaggio... ho gia' chiesto info a @toki ma ancora non ho avuto risposta.... forse sono in pre/ban
    saluti omnia
    --
    Andrea
  • Re: [SQL]Richiesta fattibilità

    Asql appena provata e funziona alla perfezione.

    grazie anche a nicolap per l'instradamento.

  • Re: [SQL]Richiesta fattibilità

    Riprendo questo mio thread per una'altra richiesta:

    devo fare una cosa simile ma quando c'è il match devo fare l'update del campo target con il campo source.

    cosi può andare?
    MERGE INTO [DB1].[owner].[tabella1] AS target 
    	USING [DB2].[owner].[tabella1] AS source
    		
    		ON (target.CAMPO1 COLLATE SQL_Latin1_General_CP1_CI_AS = source.CAMPO1 and (source.CAMPO1 <> '' OR source.CAMPO1 IS NOT NULL))
    		WHEN MATCHED THEN
    			UPDATE SET target.CAMPO1 = source.CAMPO1;
Devi accedere o registrarti per scrivere nel forum
16 risposte