Wstawianie danych
Język Transact-SQL oferuje wiele sposobów wstawiania wierszy do tabeli.
Instrukcja INSERT
Instrukcja INSERT służy do dodawania co najmniej jednego wiersza do tabeli. Istnieje kilka form instrukcji .
Poniżej przedstawiono podstawową składnię prostej instrukcji INSERT:
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
Przy użyciu tej formy instrukcji INSERT o nazwie INSERT VALUES można określić kolumny, które będą zawierać wartości umieszczone w nich, oraz kolejność, w jakiej dane będą prezentowane dla każdego wiersza wstawionego do tabeli. Column_list jest opcjonalny, ale zalecany. Bez column_list instrukcja INSERT będzie oczekiwać wartości dla każdej kolumny w tabeli w kolejności, w której zdefiniowano kolumny. Możesz również podać wartości tych kolumn jako listę rozdzielaną przecinkami.
Podczas wyświetlania listy wartości słowo kluczowe DEFAULT oznacza wstępnie zdefiniowaną wartość, która została określona podczas tworzenia tabeli, zostanie użyta. Istnieją trzy sposoby określania wartości domyślnej:
- Jeśli kolumna została zdefiniowana w celu automatycznego wygenerowania wartości, ta wartość zostanie użyta. Wartości wygenerowane automatycznie zostaną omówione w dalszej części tego modułu.
- Po utworzeniu tabeli można podać wartość domyślną dla kolumny, a ta wartość zostanie użyta, jeśli zostanie określona wartość DEFAULT.
- Jeśli kolumna została zdefiniowana tak, aby zezwalała na wartości NULL, a kolumna nie jest kolumną wygenerowaną automatycznie i nie ma zdefiniowanej domyślnej wartości NULL, zostanie wstawiona jako wartość DOMYŚLNa.
Szczegóły tworzenia tabeli wykraczają poza zakres tego modułu. Jednak często przydatne jest sprawdzenie, jakie kolumny znajdują się w tabeli. Najprostszym sposobem jest wykonanie instrukcji SELECT w tabeli bez zwracania wierszy. Używając warunku WHERE, który nigdy nie może mieć wartości TRUE, nie można zwracać wierszy.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
W tej instrukcji zostaną wyświetlone wszystkie kolumny i ich nazwy, ale nie będą wyświetlane typy danych ani jakiekolwiek właściwości, takie jak dozwolone listy NULLs lub jeśli określono wartości domyślne. Przykład danych wyjściowych zapytania może wyglądać następująco:
PromotionName
StartDate
ProductModelID
Discount
Uwagi
Aby wstawić dane do tej tabeli, możesz użyć instrukcji INSERT, jak pokazano tutaj.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
W tym przykładzie powyżej można pominąć listę kolumn, ponieważ podajemy wartość dla każdej kolumny w prawidłowej kolejności:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Załóżmy, że tabela jest zdefiniowana w taki sposób, że do kolumny StartDate jest stosowana wartość domyślna bieżącej daty, a kolumna Notatki zezwala na wartości NULL. Możesz wskazać, że chcesz jawnie użyć tych wartości, w następujący sposób:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
Alternatywnie można pominąć wartości w instrukcji INSERT, w tym przypadku wartość domyślna zostanie użyta, jeśli zostanie zdefiniowana, a jeśli nie ma wartości domyślnej, ale kolumna zezwala na NULLs, zostanie wstawiona wartość NULL. Jeśli nie podajesz wartości dla wszystkich kolumn, musisz mieć listę kolumn wskazującą, które wartości kolumn są dostarczane.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
Oprócz wstawiania pojedynczego wiersza w danym momencie instrukcja INSERT VALUES może służyć do wstawiania wielu wierszy przez podanie wielu zestawów wartości rozdzielonych przecinkami. Zestawy wartości są również oddzielone przecinkami, w następujący sposób:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
Ta lista wartości jest znana jako konstruktor wartości tabeli. Oto przykład wstawiania dwóch kolejnych wierszy do tabeli za pomocą konstruktora wartości tabeli:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
WSTAWIAĆ... WYBRAĆ
Oprócz określenia zestawu literałów wartości w instrukcji INSERT język T-SQL obsługuje również używanie wyników innych operacji w celu zapewnienia wartości insert. Możesz użyć wyników instrukcji SELECT lub danych wyjściowych procedury składowanej, aby podać wartości instrukcji INSERT.
Aby użyć instrukcji INSERT z zagnieżdżonym funkcją SELECT, utwórz instrukcję SELECT, aby zastąpić klauzulę VALUES. W tym formularzu o nazwie INSERT SELECT można wstawić zestaw wierszy zwracanych przez zapytanie SELECT do tabeli docelowej. Użycie funkcji INSERT SELECT przedstawia te same zagadnienia co INSERT VALUES:
- Opcjonalnie możesz określić listę kolumn pod nazwą tabeli.
- Dla każdej kolumny musisz podać wartości kolumny lub WARTOŚĆ DEFAULT lub NULL.
Poniższa składnia ilustruje użycie funkcji INSERT SELECT:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
Uwaga
Zestawy wyników z procedur składowanych (a nawet partii dynamicznych) mogą być również używane jako dane wejściowe instrukcji INSERT. Ta forma instrukcji INSERT o nazwie INSERT EXEC jest koncepcyjnie podobna do insert SELECT i będzie przedstawiać te same zagadnienia. Jednak procedury składowane mogą zwracać wiele zestawów wyników, dlatego wymagana jest dodatkowa ostrożność.
Poniższy przykład wstawia wiele wierszy dla nowej promocji o nazwie Get Framed przez pobranie identyfikatora modelu i nazwy modelu z tabeli Production.ProductModel dla każdego modelu zawierającego "ramkę" w nazwie.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';
W przeciwieństwie do podzapytania zagnieżdżona funkcja SELECT używana z funkcją INSERT nie jest ujęta w nawiasy.
WYBRAĆ... DO
Inną opcją wstawiania wierszy, która jest podobna do INSERT SELECT, jest instrukcja SELECT INTO. Największą różnicą między operacją INSERT SELECT i SELECT INTO jest to, że funkcja SELECT INTO nie może służyć do wstawiania wierszy do istniejącej tabeli, ponieważ zawsze tworzy nową tabelę opartą na wyniku polecenia SELECT. Każda kolumna w nowej tabeli będzie mieć taką samą nazwę, typ danych i wartość null, jak odpowiednia kolumna (lub wyrażenie) na liście SELECT.
Aby użyć funkcji SELECT INTO, dodaj new_table_name> INTO <w klauzuli SELECT zapytania tuż przed klauzulą FROM. Oto przykład, który wyodrębnia dane z tabeli Sales.SalesOrderHeader do nowej tabeli o nazwie Sales.Invoice..
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
Funkcja SELECT INTO zakończy się niepowodzeniem, jeśli istnieje już tabela o nazwie określonej po INTO. Po utworzeniu tabeli można ją traktować jak każda inna tabela. Możesz wybrać z niego, połączyć go z innymi tabelami lub wstawić do niego więcej wierszy.