Encyklopedia SQL - Kopiowanie danych między tabelami - SELECT INTO  

Udostępnij na: Facebook

Autor: Paweł Wilkosz

Opublikowano: 2012-01-27

Język T-SQL, oprócz podstawowych operacji na zbiorach danych, takich jak ekstrakcja, wstawianie, usuwanie oraz modyfikacja, umożliwia również szereg innych mechanizmów, które ułatwiają kopiowanie informacji pomiędzy wybranymi tabelami. Niniejsza publikacja swoją tematyką koncentrować się będzie na jednym z nich, a mianowicie na konstrukcji zapytania z klauzulą SELECT INTO.

Przed wykonaniem zadań zapoznaj się z następującym materiałem:

Po wykonaniu zadań będziesz wiedział:

  • w jaki sposób kopiować dane pomiędzy tabelami za pomocą instrukcji SELECT INTO.

Instrukcja SELECT INTO

Podstawowa składnia zapytania z SELECT INTO wymaga podania zbioru kolumn, które mają zostać skopiowane, nazwy tabeli docelowej, nazwy tabeli bazowej oraz ewentualne warunki ograniczające zbiór wejściowy. Wzorcowe zapytanie zostało przedstawione na poniższym listingu:

SELECT kolumna1, kolumna2, … , kolumnaN INTO tabela_docelowa
FROM Tabela_bazowa
[ON Warunek_złączenia]
WHERE warunek IN zbiór_dopasowań

Aby lepiej zrozumieć sposób konstruowania zapytania z SELECT INTO, posłużymy się następującym przykładem praktycznym. Firma Adventure Works niedawno zatrudniła nowego programistę baz danych do swojego działu IT. Postanowiła zatem przeprowadzić szkolenie z bazy danych. Organizatorzy kursu pragnęli, aby odbył się on w warunkach technicznych, jak najbardziej zbliżonych do realiów codziennej pracy. W związku z tym zdecydowali się przeprowadzić szkolenie na produkcyjnej bazie danych. Oczywiście praca na tabelach, do których trafiają zamówienia z całego dnia byłaby zbyt ryzykowna. Dlatego zadaniem programistów jest przygotowanie kopii tabeli Production.Product, która ma być wykorzystywana w ćwiczeniach praktycznych. Programiści mogli skopiować informacje na wiele sposobów, np. utworzyć nową tabelę i ręcznie, rekord po rekordzie, przenosić dane. Niestety operacja ta kosztowałaby zbyt wiele czasu oraz byłaby podatna na liczne pomyłki. Innym pomysłem jest perspektywa napisania zapytania w języku T-SQL, które poleceniem SELECT wyciąga dany rekord i za pomocą INSERT umieszcza go w nowej tabeli. Pomysł jest lepszy, lecz nadal mało praktyczny. W związku z tym specjaliści baz danych zdecydowali się wykorzystać zapytanie SELECT INTO do osiągnięcia zamierzonego celu. Konstrukcją:

SELECT * INTO Production.ProductTEST
FROM Production.Product

w przeciągu kilku milisekund utworzyli kopię tabeli Production.Product o nazwie Production.ProductTEST. Wynik działania zapytania został zaprezentowany na Rys. 1.

Rys. 1. Wynik działania zapytania z SELECT INTO dla tabeli Production.Product.

Dla pewności warto dokonać listingu zawartości tabeli Production.ProductTEST, aby potwierdzić, iż stanowi on kopię tabeli przechowującej produkty. Dane otrzymane w wyniku wykonania operacji SELECT na nowej tabeli nie pozostawiają wątpliwości, iż Production.ProductTEST jest wierną kopią tabeli Production.Product (Rys. 2.).

Rys. 2. Zawartość tabeli Production.ProductTEST.

SELECT INTO – ograniczanie zbioru wynikowego

Wraz z programistą baz danych do firmy Adventure Works został zatrudniony również przedstawiciel handlowy. Dla niego dział HR przygotował osobne szkolenie ze sprzedaży produktów Flat Washer. Dział IT został poproszony o przygotowanie tabeli Production.ProductSalesTEST z kopią rekordów z tabeli Production.Product, ale tylko tych, które dotyczą Flat Washer. Ponadto, aby nie zaciemniać celu kursu, nowa tabela miała zawierać wyłącznie kolumny: ProductID, Name, ProductNumber. Za pomocą zapytania:

SELECT ProductID, Name, ProductNumber
INTO Production.ProductSalesTEST
FROM Production.Product
WHERE Name LIKE ‘Flat Washer%’

programiści utworzyli nową tabelę (Production.ProductSalesTEST), składającą się wyłącznie z 3 kolumn (ProductID, Name, ProductNumber) i zawierającą jednocześnie 9 rekordów skopiowanych z Production.Product, które dotyczą linii Flat Washer. Wynik działania zapytania został przedstawiony na rRys. 3.

Rys. 3. Tworzenie nowej tabeli i kopiowanie danych z innej tabeli za pomocą SELECT INTO wraz z ograniczeniem zbioru bazowego.

Podstawowe błędy i problemy z wykorzystaniem SELECT INTO

Mimo iż zapytanie wykorzystujące SELECT INTO posiada relatywnie prostą konstrukcję, programista może napotkać liczne problemy, wynikające z semantyki operacji, wykonywanych na bazie danych. W tym celu w tabeli 1. zestawiłem trzy najbardziej popularne kody błędów, które możesz napotkać podczas wykonywania zapytań z konstrukcją SELECT INTO.

Tabela 1. Lista najczęstszych błędów podczas pracy z SELECT INTO.

Kod błędu Wiadomość Opis
2714 There is already an object named XXX in the database. Próba ponownego wykonania zapytania SELECT INTO ze wskazaną tabelą, która już istnieje w bazie danych.
207 Invalid column name XXX Prawdopodobnie tabela bazowa nie zawiera kolumny XXX, która ma być skopiowana do tabeli docelowej.
1038 An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name.

Błąd jest generowany przy próbie wstawiania danych do tabeli, która nie istnieje, bez podania aliasu kolumn. Przykładowo, poniższe zapytanie na pewno wygeneruje błąd 1038:

SELECT ‘test’
INTO HelloWorldTable

Aby zapytanie wykonało się poprawnie, należy nadać alias kolumny, do której docelowo trafi łańcuch znakowy ‘test’, czyli:

SELECT ‘test’ AS TestColumn
INTO HelloWorldTable

 

Informacja

Zapamiętaj, że:

  1. Klauzula SELECT INTO pozwala na konstruowanie zapytań kopiujących dane z jednej tabeli do drugiej.
  2. Jeżeli tabela docelowa nie istnieje w bazie danych, SELECT INTO utworzy ją wg schematu tabeli bazowej bądź na podstawie wskazanych aliasów kolumn.
  3. Typ danych kolumn nowej tabeli będzie określony, podczas wykonywania zapytania, na podstawie danych, jakie zostaną w niej umieszczone.

Podsumowanie

W tej części Encyklopedii SQL dowiedziałeś się, w jaki sposób szybko skopiować informacje pomiędzy tabelami oraz jak wykorzystać SELECT INTO do tworzenia kopii zapasowych określonych obiektów bazy danych.

W kolejnej części nauczysz się usuwać rekordy, tabele, obiekty z serwera SQL za pomocą operacji DELETE.

Dodatkowo zobacz: