Encyklopedia SQL - Kopiowanie danych między tabelami - SELECT INTO
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:
- Wyświetlanie danych, podstawowy SELECT i wybór kolumn
- Ograniczanie wyświetlania wierszy, podstawy WHERE
- Łączenie warunków ograniczających, AND, OR w WHERE
- Dodawanie danych - INSERT
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’ 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 |
Informacja |
Zapamiętaj, że:
|
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: