Domanda

Sono ancora abbastanza nuovo in T-SQL e SQL 2005.Devo importare una colonna di numeri interi da una tabella nel database1 in una tabella identica (manca solo la colonna di cui ho bisogno) nel database2.Entrambi sono database SQL 2005.Ho provato il comando di importazione integrato in Server Management Studio ma mi costringe a copiare l'intera tabella.Ciò causa errori dovuti a vincoli e colonne di "sola lettura" (qualunque cosa significhi "sola lettura" in sql2005).Voglio solo prendere una singola colonna e copiarla in una tabella.

Deve esserci un modo semplice per farlo.Qualcosa di simile a:

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
È stato utile?

Soluzione

L'inserimento non lo farà poiché tenterà di inserire nuove righe alla fine della tabella.Quello che sembra che tu stia cercando di fare è aggiungere una colonna alla fine delle righe esistenti.

Non sono sicuro che la sintassi sia esattamente corretta ma, se ti ho capito, questo farà quello che cerchi.

  1. Crea la colonna che consente i valori null nel database2.

  2. Eseguire un aggiornamento:

    AGGIORNAMENTO DATABASE2.DBO.TableName SET DATABASE2.DBO.TableName.colname = database1.dbo.tablename.colname da database2.dbo.tablename interno join database1.dbo.tablename su database2.dbo.tablename.keycol = database1.dbo.tablename. Keycol

Altri suggerimenti

Esiste un modo semplice molto simile a questo purché entrambi i database si trovino sullo stesso server.Il nome completamente qualificato è dbname.owner.table - Normalmente il proprietario è DBO e c'è un collegamento per ".dbo". che è "..", quindi ...

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable

prima crea la colonna se non esiste:

ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed

e poiché stai utilizzando SQL Server 2005 puoi utilizzare il nuovo UNISCI dichiarazione.IL UNISCI L'affermazione ha il vantaggio di poter trattare tutte le situazioni in un'unica affermazione come le righe mancanti dall'origine (può eseguire inserimenti), le righe mancanti dalla destinazione (può eseguire eliminazioni), le righe corrispondenti (può eseguire aggiornamenti) e tutto viene eseguito atomicamente in un'unica transazione.Esempio:

MERGE database2..targetTable AS t
USING (SELECT sourceColumn FROM sourceDatabase1..sourceTable) as s
ON t.PrimaryKeyCol = s.PrimaryKeyCol -- or whatever the match should be bassed on
WHEN MATCHED THEN 
    UPDATE SET t.targetColumn = s.sourceColumn
WHEN NOT MATCHED THEN
    INSERT (targetColumn, [other columns ...]) VALUES (s.sourceColumn, [other values ..])

L'istruzione MERGE è stata introdotta per risolvere casi come il tuo e consiglio di utilizzarla, è molto più potente delle soluzioni che utilizzano più istruzioni batch SQL che sostanzialmente realizzano la stessa cosa che fa MERGE in un'unica istruzione senza la complessità aggiuntiva.

Potresti anche usare un cursore.Supponendo che tu voglia ripetere tutti i record nella prima tabella e popolare la seconda tabella con nuove righe, qualcosa del genere sarebbe la strada da percorrere:

DECLARE @FirstField nvarchar(100)

DECLARE ACursor CURSOR FOR
SELECT FirstField FROM FirstTable 

OPEN ACursor
FETCH NEXT FROM ACursor INTO @FirstField
WHILE @@FETCH_STATUS = 0
BEGIN

   INSERT INTO SecondTable ( SecondField ) VALUES ( @FirstField )

   FETCH NEXT FROM ACursor INTO @FirstField

END

CLOSE ACursor   
DEALLOCATE ACursor

MERGE è disponibile solo in SQL 2008 NON SQL 2005

inserire in Test2.dbo.MyTable (MyValue) selezionare MyValue da Test1.dbo.MyTable

Ciò presuppone molto.Innanzitutto che il database di destinazione sia vuoto.In secondo luogo, le altre colonne sono annullabili.Potrebbe invece essere necessario un aggiornamento.Per fare ciò dovrai avere una chiave comune.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top