Accodare righe tra tabelle identiche (o quasi) - c'è un modo veloce pe...

lunedì 27 novembre 2006 - 01.07

antogavi Profilo | Newbie


Ho due tabelle quasi identiche. Tab1 di 82 colonne e Tab2 di 83 colonne dove le prime 82 colonne hanno lo stesso nome, e la stessa formattazione ed identica sequenza.
C'è un modo veloce di accodare il contenuto di Tab2 in Tab 1 (senza enunciare tutte le colonne dopo il comando INSERT) per le prime 82 colonne?

E' per finire in bellezza con la domandina della sera: se da una query in SQL lancio una stored, le variabili da questa generata possono 'ritornare' alla query senza doverle eneunciare per poter essere poi 'passate' ad una nuova stored che eseguo in successione?

Sono le prime righe di codice che scrivo e nonostante qualche mezzo metro (in altezza) di libroni e l'aiuto dei forum credo di fare un gran 'casino' nei concetti di base. Un mega grazie anticipato a chi riesce a darmi una dritta.

Antonello

Lungo è il cammino del viaggiatore senza meta e grandi le scoperte che lo aspettano.

lbenaglia Profilo | Guru

>C'è un modo veloce di accodare il contenuto di Tab2 in Tab 1
>(senza enunciare tutte le colonne dopo il comando INSERT) per
>le prime 82 colonne?

Ciao Antonello,

la risposta è no.
Inoltre se hai una tabella con tutte quelle colonne molto probabilmente non rispetta almeno una delle 3 forme normali comunemente utilizzate nella progettazione di una base dati:
http://en.wikipedia.org/wiki/Database_normalization

>E' per finire in bellezza con la domandina della sera: se da
>una query in SQL lancio una stored, le variabili da questa generata
>possono 'ritornare' alla query senza doverle eneunciare per poter
>essere poi 'passate' ad una nuova stored che eseguo in successione?
In SQL Server le variabili sono solo locali, pertanto se hai la necessità di passare alcuni valori generati da una stored procedure ad una seconda devi:

1) Dichiarare localmente le variabili al batch corrente;
2) Richiamare la prima stored procedure specificando tali variabili come parametri di output (sempre che la sp preveda quei parametri di output);
3) Richiamare la seconda stored procedure passando tali variabili come parametri di input (sempre che la sp preveda quei parametri di input).

Facciamo un esempio:

USE tempdb; GO CREATE PROCEDURE dbo.up_Proc1( @Param1 int OUTPUT, @Param2 int OUTPUT ) AS SET @Param1 = 10; SET @Param2 = 20; GO CREATE PROCEDURE dbo.up_Proc2( @Param1 int, @Param2 int ) AS SELECT @Param1 AS Param1, @Param2 AS Param2; GO DECLARE @Param1 int; DECLARE @Param2 int; EXEC dbo.up_Proc1 @Param1 OUTPUT, @Param2 OUTPUT; EXEC dbo.up_Proc2 @Param1, @Param2; /* Output: Param1 Param2 ----------- ----------- 10 20 (1 row(s) affected) */ DROP PROCEDURE dbo.up_Proc1, dbo.up_Proc2;

>Sono le prime righe di codice che scrivo e nonostante qualche
>mezzo metro (in altezza) di libroni e l'aiuto dei forum credo
>di fare un gran 'casino' nei concetti di base. Un mega grazie
>anticipato a chi riesce a darmi una dritta.
In bocca al lupo

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

antogavi Profilo | Newbie

Purtroppo le tabelle sono presenti in un db esistente. Devo far di necessità virtù.

Per quanto riguarda le variabili, il problema è quello di eseguire query parametriche. Ho letto alcune tue risposte in merito all'utilizzo di query parametriche ed anche l'articolo a cui rimandi e vorrei quindi spostare parte del codice in stored, passando però le variabili alle stored (non mi dovrebbero servire di ritorno perchè quelle create nella stored vengono prima salvate in tabella)

Devo ottenere questo scopo:
Creare la distinta base di un prodotto sulla base di regole parametriche tipiche pe ciascuna tipologia di prodotto.

In pratica

per il prodotto 'prod' (oggi scritto manualmente nella in query ma domani prelevato da una tabella) leggo in tabella qual'è tipo di distinta base devo applicare es 'nome1'

leggo quindi dalla tabella variabili il valore delle stesse per quel tipo di distinta

tabella variabili
nomerec nomevar valore
----------- ------------- ----------
nome1 @a 10
nome1 @b 15
nome1 @c 5
nome2 @a 7
.......

lancio una iterazione dove da una tabella che elenca tutti i campi del record distinta leggo il nome del campo da trattare

id nome campi
----------
1 campo1
2 campo2
......

leggo poi dalla tabella regole la stringa di comando per quel tipo di distinta/campo

tabella regole

nomerec campo1 campo2
---------- ------------ -----------
nome1 'pippo'+convert(char @a) @b*@c
nome2 'gio'+convert(..@c+@d) @a


lancio mediante exec sp_execproceduresql la stringa, con gli opportuni 'smandrappamenti' prima per convertire le variabili in valori
e scrivo il risultato del campo di quel 'prod' nella tabella di destinazione

tabella destinazione

nomerec campo1 campo2
---------- ------------ -----------
nome1 pippo10 20

ritorno alla lettura del nome del secondo campo e ripeto l'operazione fino ad aver terminato tutti i campi del record.

quando ho terminato torno alla lettura del nuovo codice prodotto e riparto con l'iterazione e così via fino ad aver creato le distinte base di tutti i prodotti.

Il codice che ho scritto funziona (manca la lettura del primo prodotto ma mi sembra la cosa più semplice) ma non mi piace molto.

C'è qualcuno che ha voglia di dare un'occhiata e darmi qualche dritta sul come poterlo migliorare. Mi rendo conto che è un pò 'incasinato' e non pretendo certo correzioni. Basterebbe quanche input sul quale riflettere.

-----------------------------------
declare @test1 varchar (200),
@test2 varchar (200),
@test3 varchar (200),
@A real,
@b real,
@sql nvarchar(4000),
@strsql nvarchar(4000),
@sqlcampo nvarchar(4000),
@codart varchar(40),
@comp varchar(10),
@params nvarchar(4000),
@codart2 varchar(20),
@codcamp varchar(40),
@codcamp1 varchar(40),
@campo varchar (30),
@set varchar (5),
@countcamp int,
@ContComp int,
@c1 decimal(10,4),
@c2 decimal(10,4),
@c3 decimal(10,4),
@c4 decimal(10,4),
@c5 decimal(10,4),
@c6 decimal(10,4),
@c7 decimal(10,4),
@c8 decimal(10,4),
@c9 decimal(10,4),
@c0 decimal(10,4)

SET @C0=0
set @C1=0
SET @C2=0
SET @C3=0
SET @C4=0
SET @C5=0
SET @C6=0
SET @C7=0
SET @C8=0
SET @C9=0

set @set='set '
set @codart='1210-10100'
select @b= lung, @a=alt, @comp=u_codtipdist from articoli where codart=@codart

-- Declare the variables to store the values returned by FETCH.
DECLARE @Costante varchar(3), @Valore decimal(10,4)
DECLARE Costante_cursor CURSOR FOR
SELECT Costante, Valore FROM U_dibaComp_Costanti where Articolo=@comp
ORDER BY Costante

OPEN Costante_cursor

-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement.


FETCH NEXT FROM costante_cursor
INTO @costante, @Valore
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
If @costante='@C0' set @C0=@VALORE else
If @costante='@C1' set @C1=@VALORE else
If @costante='@C2' set @C2=@VALORE else
If @costante='@C3' set @C3=@VALORE else
If @costante='@C4' set @C4=@VALORE else
If @costante='@C5' set @C5=@VALORE else
If @costante='@C6' set @C6=@VALORE else
If @costante='@C7' set @C7=@VALORE else
If @costante='@C8' set @C8=@VALORE else
If @costante='@C9' set @C9=@VALORE else
print 'no'
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM costante_cursor
INTO @Costante, @Valore
END
CLOSE costante_cursor
DEALLOCATE costante_cursor

BEGIN TRAN UNO
select @test1=rtrim(codcomp) from U_dibacomp where comp=@comp and numcomp=1
set @params=N'@CODART1 VARCHAR (20) OUTPUT, @B real,@a real,@C0 FLOAT,@C1 FLOAT,@C2 FLOAT, @C3 FLOAT, @C4 FLOAT, @C5 FLOAT, @C6 FLOAT, @C7 FLOAT, @C8 FLOAT, @C9 FLOAT';
set @sql = N'select @CODART1='+@test1
EXEC sp_executesql @sql, @PARAMS, @b = @b, @a=@a, @C0=@C0,@C1=@C1,@C2=@C2,@C3=@C3,@C4=@C4,@C5=@C5,@C6=@C6,@C7=@C7,@C8=@C8,@C9=@C9, @CODART1=@CODART2 output
PRINT ' UNO'
PRINT @PARAMS
PRINT @TEST1
print 'codart'
Print @sql
Print @codart2
Insert U_ArtiDiba
(CodArt, livello)
Values (@codart2,1)
COMMIT TRAN

SET @countcamp=1
WHile @countcamp<=82
BEGIN
set @campo=''
set @strsql=''
set @params=''
set @sql=''
set @sqlcampo=''
set @test1=''
set @test2=''
set @test3=''
set @codcamp1=''
set @codcamp=''
select @campo=campo from U_ArtiDibaCampi where idcampo=@countcamp
set @strsql= N'select @test3=rtrim('+@campo+N') from U_dibacomp where comp='+@comp +N' and numcomp=1'
exec sp_executesql @strsql, N'@test3 varchar(200) output', @test3=@test2 output
set @params=N'@CODCAMP1 VARCHAR (20) OUTPUT, @B real,@a real,@C0 FLOAT,@C1 FLOAT,@C2 FLOAT,@C3 FLOAT, @C4 FLOAT, @C5 FLOAT, @C6 FLOAT, @C7 FLOAT, @C8 FLOAT, @C9 FLOAT';
set @sql = N'select @CODCAMP1='+@test2
EXEC sp_executesql @sql, @PARAMS, @b = @b, @a=@a, @C0=@C0,@C1=@C1,@C2=@C2,@C3=@C3,@C4=@C4,@C5=@C5,@C6=@C6,@C7=@C7,@C8=@C8,@C9=@C9, @CODCAMP1=@CODCAMP output
set @sqlcampo=N'Update U_ArtiDiba '+N''+@set+@campo+N' = '''+@codcamp+N''' where codart = '''+@CODART2+char(39)
PRINT @SQLCAMPO
EXEC sp_executesql @sqlcampo
Print 'codcamp: '+@campo
Print '-----'
IF @@ERROR <>0
BREAK
set @countcamp=@countcamp+1
END

---------------------------
Per esempio, potrei portare le due transazioni in due diverse stored e richiamare poi le stored, penso dovrebbe funzionare.

Una curiosità, in una query di access posso indicare in una from il nome di database\tabella come variabile, se no come posso prima renderlo stringa?


Grazie
Antonello


........ho scoperto un mondo che non conoscevo. Evviva !!!!!!!! ....che paura!!!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5