WSTAW przykłady (Transact-SQL)
W tym temacie przedstawiono przykłady używania Transact-SQL WSTAW instrukcja w SQL Server 2008 R2. Przykłady WSTAW są pogrupowane według następujących kategorii.
Kategoria |
Elementy składni duży |
---|---|
Podstawowa składnia |
WSTAW • tabela wartość konstruktora |
Obsługa wartości w kolumna |
• Typy zdefiniowane przez użytkownika wartości domyślnej • NEWID • tożsamości |
Wstawianie danych z innych tabel |
INSERT...• SELECT, INSERT...WYKONANIE • Z typowych tabela wyrażenie • góry |
Określanie obiektów miejsce docelowe , innych niż standardowe tabele |
Zmienne tabela • widoków |
Wstawianie wierszy w tabela zdalna |
Serwer połączony • OTWÓRZKWERENDĘ zestaw wierszy funkcja • OPENDATASOURCE zestaw wierszy funkcja |
Luzem, importowania danych z tabel lub plików danych |
INSERT...Wybierz • OPENROWSET funkcja |
Przesłanianie domyślne zachowanie optymalizator kwerendy przy użyciu wskazówek |
Wskazówki do tabeli |
Przechwytywanie wyniki instrukcjaINSERT |
Dane wyjściowe klauzula |
Podstawowa składnia
W tej sekcji przykładach podstawowych funkcji WSTAW instrukcja przy użyciu minimalnej wymaganej składni.
A.Wstawianie pojedynczego wiersza danych
Poniższy przykład wstawia wiersz do tabela Production.UnitMeasure.Kolumny w tej tabela są UnitMeasureCode, Name, i ModifiedDate.Ponieważ wartości dla wszystkich kolumn są dostarczane i są wyświetlane w kolejności kolumn w tabela, nazwy kolumna nie się określone na liście kolumna.
USE AdventureWorks2008R2;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
GO
B.Wstawianie wielu wierszy danych
W poniższym przykładzie użyto tabela wartość konstruktora Aby wstawić trzy wiersze do Production.UnitMeasure tabela w pojedynczej instrukcjaINSERT.Ponieważ wartości dla wszystkich kolumn są dostarczane i są wyświetlane w kolejności kolumn w tabela, nazwy kolumna ma określony na liście kolumna .
USE AdventureWorks2008R2;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923');
GO
C.Wstawianie danych, który nie jest w kolejności kolumn tabela
W poniższym przykładzie użyto listy kolumna do jawnego określenia wartości, które są wstawiane do każdej kolumna.Kolejność kolumna w Production.UnitMeasure tabela jest UnitMeasureCode, Name, ModifiedDate; Jednak kolumny nie są wymienione w tej kolejności, w column_list.
USE AdventureWorks2008R2;
GO
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
GO
Obsługa wartości w kolumnie
W tej sekcji przykładach metod wstawiania wartości do kolumn, które są zdefiniowane przy użyciu tożsamości właściwość, wartość domyślna lub są definiowane z typami danych, takich jak uniqueidentifer lub typ zdefiniowany przez użytkownika kolumny.
A.Wstawianie danych do tabela z kolumny, które mają wartości domyślne
Poniższy przykład pokazuje, wstawianie wierszy do tabela z kolumnami, które automatycznie generuje wartość lub wartość domyślna.Column_1jest obliczana kolumna automatycznie generuje wartość poprzez konkatenację ciąg wartości wstawione do column_2.Column_2jest zdefiniowana z ograniczeniem domyślne.Jeżeli nie określono wartości dla tej kolumna, używana jest wartość domyślna.Column_3definicja z rowversion Typ danych, które automatycznie generuje unikatowy, zwiększając liczbę binarną.Column_4automatycznie generuje wartość.Nie określono wartości dla tej kolumna , dodaje się wartość NULL.Instrukcje WSTAWIAJĄCE wstawić wiersze zawierające wartości dla niektórych kolumn, ale nie wszystkie.W ostatnim INSERT instrukcjasą określone żadne kolumny i wartości domyślne są wstawiane za pomocą wartości domyślne klauzula.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
column_1 AS 'Computed column ' + column_2,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 rowversion,
column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4)
VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4)
VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2)
VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO
B.Wstawianie danych do tabela zawierającej kolumnatożsamości
W poniższym przykładzie pokazano różne metody Wstawianie danych do kolumna.Dwa pierwsze instrukcji INSERT Zezwalaj na wartości tożsamości ma być generowana dla nowych wierszy.Trzecia WSTAW instrukcja zastępuje tożsamości właściwość dla kolumna z zestawu IDENTITY_INSERT instrukcja i wstawia jawną wartość do kolumnatożsamości.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));
GO
INSERT T1 VALUES ('Row #1');
INSERT T1 (column_2) VALUES ('Row #2');
GO
SET IDENTITY_INSERT T1 ON;
GO
INSERT INTO T1 (column_1,column_2)
VALUES (-99, 'Explicit identity value');
GO
SELECT column_1, column_2
FROM T1;
GO
C.Wstawianie danych do uniqueidentifier kolumna przy użyciu NEWID()
W poniższym przykładzie użyto NEWID() funkcja uzyskać identyfikator GUID dla column_2.W przeciwieństwie do kolumny tożsamości Aparat baz danych nie generuje automatycznie wartości dla kolumn z uniqueidentifier typu danych, przedstawiony przez drugi INSERT instrukcja.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 uniqueidentifier,
);
GO
INSERT INTO dbo.T1 (column_2)
VALUES (NEWID());
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2
FROM dbo.T1;
GO
D.Wstawianie danych do kolumn typ zdefiniowany przez użytkownika
Następujące Transact-SQL instrukcji wstawione trzy wiersze PointValue kolumna Points tabela.W tej kolumna używa zdefiniowany przez użytkownika typ CLR (UDT).Point Typ danych składa się z x i y całkowitej wartości, które są dostępne jako właściwości UDT.Należy użyć albo RZUTOWANIA lub konwersji funkcja do oddania rozdzielany przecinkami wartości x i y Point typu.Pierwsze dwa sprawozdania za pomocą funkcja konwersji do konwersji wartości ciąg na Point Typ, a trzecia instrukcja wykorzystuje funkcjaCAST.Aby uzyskać więcej informacji, zobacz Manipulowania danymi UDT.
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));
Wstawianie danych z innych tabel
W tej sekcji przykładach metod wstawiania wierszy z jednej tabela do innej tabela.
A.Wstawić dane z innych tabel przy użyciu opcji wybierz i wykonywanie
Poniższy przykład ilustruje sposób wstawiania danych z jednej tabela do innej tabela przy użyciu INSERT...Zaznacz lub INSERT...WYKONANIE.Każdy jest oparty na multi -tabela SELECT instrukcja zawierającą wyrażenie i wartość literału na liście kolumna .
WSTAW pierwszej instrukcja używa instrukcja SELECT do uzyskania danych z tabel źródło (Employee, SalesPerson, i Person) i przechowywać zestaw wyników w EmployeeSales tabela.Druga WSTAW instrukcja używa EXECUTE klauzula do wywoływania procedura składowana , która zawiera instrukcjaSELECT, a trzeci WSTAW używa EXECUTE klauzula Aby odwołać instrukcja SELECT jako literał ciąg.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL
DROP PROCEDURE uspGetEmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( DataSource varchar(20) NOT NULL,
BusinessEntityID varchar(11) NOT NULL,
LastName varchar(40) NOT NULL,
SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales
AS
SET NOCOUNT ON;
SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...SELECT example
INSERT INTO dbo.EmployeeSales
SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT INTO dbo.EmployeeSales
EXECUTE dbo.uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT INTO dbo.EmployeeSales
EXECUTE
('
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE ''2%''
ORDER BY sp.BusinessEntityID, c.LastName
');
GO
--Show results.
SELECT DataSource,BusinessEntityID,LastName,SalesDollars
FROM dbo.EmployeeSales;
GO
B.Do definiowania danych wstawione przy użyciu tabelatypowewyrażenie
Poniższy przykład tworzy NewEmployee tabela.Typowewyrażenie tabela(EmployeeTemp) definiuje wiersze z jednej lub więcej tabel do NewEmployeetabela. instrukcja INSERT odwołuje się do kolumn w tabelatypowewyrażenie.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
PhoneNumber Phone NULL,
AddressLine1 nvarchar(60) NOT NULL,
City nvarchar(30) NOT NULL,
State nchar(3) NOT NULL,
PostalCode nvarchar(15) NOT NULL,
CurrentFlag Flag
);
GO
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,
Address, City, StateProvince,
PostalCode, CurrentFlag)
AS (SELECT
e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
INNER JOIN Person.PersonPhone AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Person as c
ON e.BusinessEntityID = c.BusinessEntityID
)
INSERT INTO HumanResources.NewEmployee
SELECT EmpID, LastName, FirstName, Phone,
Address, City, StateProvince, PostalCode, CurrentFlag
FROM EmployeeTemp;
GO
C.Korzystanie z góry do ograniczenia danych wstawianych ztabela źródło
W poniższym przykładzie użyto góry klauzula ograniczyć liczbę wierszy do NewEmployee tabela z Employee tabela.Przykład wstawia dane adres pierwszego losowo zestaw 10 pracowników z Employee tabela w typie.Aby sprawdzić zawartość następnie wykonaniu instrukcja SELECT NewEmployee tabela.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
BusinessEntityID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
PhoneNumber Phone NULL,
AddressLine1 nvarchar(60) NOT NULL,
City nvarchar(30) NOT NULL,
State nchar(3) NOT NULL,
PostalCode nvarchar(15) NOT NULL,
CurrentFlag Flag
);
GO
-- Insert 10 random rows into the table NewEmployee.
INSERT TOP (10) INTO HumanResources.NewEmployee
SELECT
e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
INNER JOIN Person.PersonPhone AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Person as c
ON e.BusinessEntityID = c.BusinessEntityID;
GO
SELECT BusinessEntityID, LastName, FirstName, PhoneNumber,
AddressLine1, City, State, PostalCode, CurrentFlag
FROM HumanResources.NewEmployee;
GO
Określanie obiektów docelowych, innych niż standardowe tabele
Przykłady w tej sekcji przedstawiają sposób wstawiania wierszy przez określenie zmiennej tabela lub widoku.
A.Wstawianie danych przez określenie widoku
W następującym przykładzie określono nazwę widoku jako obiekt miejsce docelowe ; Jednak w tabela bazowadodaje się nowy wiersz.Kolejność wartości w INSERT,instrukcja musi odpowiadać kolejności kolumna w widoku. Aby uzyskać więcej informacji, zobacz Modyfikowanie danych przy użyciu widoku.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
DROP VIEW dbo.V1;
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30));
GO
CREATE VIEW V1 AS
SELECT column_2, column_1
FROM T1;
GO
INSERT INTO V1
VALUES ('Row 1',1);
GO
SELECT column_1, column_2
FROM T1;
GO
SELECT column_1, column_2
FROM V1;
GO
B.Wstawianie danych do zmiennej tabela
W następującym przykładzie określono zmiennej tabela jako obiekt miejsce docelowe .
USE AdventureWorks2008R2;
GO
-- Create the table variable.
DECLARE @MyTableVar table(
LocationID int NOT NULL,
CostRate smallmoney NOT NULL,
NewCostRate AS CostRate * 1.5,
ModifiedDate datetime);
-- Insert values into the table variable.
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)
SELECT LocationID, CostRate, GETDATE() FROM Production.Location
WHERE CostRate > 0;
-- View the table variable result set.
SELECT * FROM @MyTableVar;
GO
Wstawianie wierszy do tabeli zdalnej
Przykłady w tej sekcji przedstawiają sposób Wstawianie wierszy do zdalnego miejsce docelowetabela za pomocą serwer połączony lub zestaw wierszy,funkcja Aby odwołać się za tabela zdalna.
A.Wstawianie danych do tabela zdalna przy użyciu serwer połączony
Poniższy przykład wstawia wiersze do tabela zdalna.Przykład rozpoczyna się przez utworzenie łącza do dane zdalne źródło przy użyciu sp_addlinkedserver.Nazwa serwer połączony MyLinkServer, następnie jest określony jako część nazwy czteroczęściowym identyfikatorem obiektu w formularzu server.catalog.schema.object.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.
EXEC sp_addlinkedserver @server = N'MyLinkServer',
@srvproduct = N' ',
@provider = N'SQLNCLI',
@datasrc = N'server_name',
@catalog = N'AdventureWorks2008R2';
GO
USE AdventureWorks2008R2;
GO
-- Specify the remote data source in the FROM clause using a four-part name
-- in the form linked_server.catalog.schema.object.
INSERT INTO MyLinkServer.AdventureWorks2008R2.HumanResources.Department (Name, GroupName)
VALUES (N'Public Relations', N'Executive General and Administration');
GO
B.Wstawianie danych do tabela zdalna za pomocą funkcjaOtwórzKwerendę (OpenQuery)
Poniższy przykład wstawia wiersz do tabela zdalna przez określenie OTWÓRZKWERENDĘ zestaw wierszy funkcja.Nazwa serwer połączony , utworzonego w poprzednim przykładzie jest używany w tym przykładzie.
-- Use the OPENQUERY function to access the remote data source.
INSERT OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2008R2.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
C.Wstawianie danych do tabela zdalna za pomocą funkcjaOPENDATASOURCE
Poniższy przykład wstawia wiersz do tabela zdalna przez określenie OPENDATASOURCE zestaw wierszy funkcja.Określ prawidłową nazwa serwera źródło danych przy użyciu formatu nazwa_serwera lub server_name\instance_name.
-- Use the OPENDATASOURCE function to specify the remote data source.
-- Specify a valid server name for Data Source using the format server_name or server_name\instance_name.
INSERT INTO OPENDATASOURCE('SQLNCLI',
'Data Source= <server_name>; Integrated Security=SSPI')
.AdventureWorks2008R2.HumanResources.Department (Name, GroupName)
VALUES (N'Standards and Methods', 'Quality Assurance');
GO
Importowanie danych z tabel lub plików danych luzem
W tej sekcji przykładach dwie metody (ładowanie zbiorcze), import zbiorczy dane do tabela za pomocą instrukcjaINSERT.
A.Wstawianie danych do sterty z minimalnym rejestrowania
Poniższy przykład tworzy nową tabela (sterty) i wstawia dane z innej tabela do niej za pomocą minimalnych rejestrowania.W przykładzie założono, że model odzyskiwanie AdventureWorks2008R2 bazy danych jest zestaw na pełnej.Aby zapewnić minimalny rejestrowanie jest używany, modelu odzyskiwanie z AdventureWorks2008R2 bazy danych jest zestaw na BULK_LOGGED przed wiersze są wstawiane i zresetować pełne po INSERT INTO...instrukcjaSELECT.Ponadto określono dla miejsce docelowetabelawskazówki TABLOCKSales.SalesHistory. Dzięki temu instrukcja korzysta z minimalnym miejsca w dzienniku transakcji a wykonuje efektywnie.
USE AdventureWorks2008R2;
GO
-- Create the target heap.
CREATE TABLE Sales.SalesHistory(
SalesOrderID int NOT NULL,
SalesOrderDetailID int NOT NULL,
CarrierTrackingNumber nvarchar(25) NULL,
OrderQty smallint NOT NULL,
ProductID int NOT NULL,
SpecialOfferID int NOT NULL,
UnitPrice money NOT NULL,
UnitPriceDiscount money NOT NULL,
LineTotal money NOT NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL,
ModifiedDate datetime NOT NULL );
GO
-- Temporarily set the recovery model to BULK_LOGGED.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY BULK_LOGGED;
GO
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory
INSERT INTO Sales.SalesHistory WITH (TABLOCK)
(SalesOrderID,
SalesOrderDetailID,
CarrierTrackingNumber,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice,
UnitPriceDiscount,
LineTotal,
rowguid,
ModifiedDate)
SELECT * FROM Sales.SalesOrderDetail;
GO
-- Reset the recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO
B.Przy użyciu funkcja OPENROWSET luzem do import zbiorczy danych do tabela
Poniższy przykład wstawia wiersze z pliku danych do tabela przez określenie funkcjaOPENROWSET.Wskazówka IGNORE_TRIGGERS tabela jest określony dla optymalizacji wydajności.Aby zapoznać się z większą liczbą przykładów, zobacz Importowanie danych luzem za pomocą ZBIORCZYM WSTAWIANIEM lub OPENROWSET(BULK...).
-- Use the OPENROWSET function to specify the data source and specifies the IGNORE_TRIGGERS table hint.
INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)
SELECT b.Name, b.GroupName
FROM OPENROWSET (
BULK 'C:\SQLFiles\DepartmentData.txt',
FORMATFILE = 'C:\SQLFiles\BulkloadFormatFile.xml',
ROWS_PER_BATCH = 15000)AS b ;
GO
Przesłanianie domyślne zachowanie Optymalizator kwerend przy użyciu wskazówek
Przykłady w tej sekcji przedstawiają sposób zastosowania tabela wskazówki Aby tymczasowo zastąpić domyślne zachowanie optymalizator kwerendy podczas przetwarzania instrukcjaINSERT.
Przestroga |
---|
Ponieważ SQL Server optymalizator kwerendy zazwyczaj wybiera najlepszego planu wykonania kwerendy, firma Microsoft zaleca wskazówki był używany tylko w ostateczności przez doświadczonych programistów i administratorów baz danych. |
A.Określanie blokowania metodaza pomocą wskazówki TABLOCK
W następującym przykładzie określono podjęcia wyłączności (X) blokada w tabela Production.Location i jest utrzymywana aż do końca instrukcjaINSERT.
USE AdventureWorks2008R2;
GO
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
GO
Przechwytywanie wyników instrukcji INSERT
Przykłady w tej sekcji przedstawiają sposób zastosowania Dane wyjściowe klauzuli zwracają informacje z lub wyrażenia w oparciu o każdy wiersz dotyczy INSERT instrukcja.Te wyniki mogą być zwracane do aplikacji przetwarzającej do użycia w takich elementów, jak komunikatów potwierdzających, archiwizowanie i innych takich wymagań aplikacji.
Dane wyjściowe przy użyciu WSTAW instrukcja
Poniższy przykład ilustruje wstawienie wiersza do ScrapReasontabela i używa danych wyjściowych klauzula można zwrócić wyniki instrukcja , aby @MyTableVarzmiennejtabela . Ponieważ ScrapReasonID kolumna w ScrapReason tabela jest zdefiniowana z tożsamości właściwość, wartość nie zostanie określona w instrukcja INSERT dla tej kolumna.Należy jednak zauważyć, że wartość generowana przez Aparat baz danych dla tej kolumna jest zwracany w danych wyjściowych klauzula w INSERTED.ScrapReasonID kolumna.
USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
GO
B.Z tożsamości i kolumny obliczane przy użyciu danych wyjściowych
Poniższy przykład tworzy EmployeeSales tabela a następnie wstawia kilka wierszy do go przy użyciu INSERT instrukcja SELECT instrukcja do pobierania danych z tabelami źródło .EmployeeSalestabela zawiera kolumna ( EmployeeID) i obliczanej kolumna (ProjectedSales).Ponieważ wartości te są generowane przez Aparat baz danych podczas wykonywania operacji wstawiania żadna z tych kolumn można zdefiniować w @MyTableVar.
USE AdventureWorks2008R2 ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( EmployeeID int IDENTITY (1,5)NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL,
ProjectedSales AS CurrentSales * 1.10
);
GO
DECLARE @MyTableVar table(
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL
);
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)
OUTPUT INSERTED.LastName,
INSERTED.FirstName,
INSERTED.CurrentSales
INTO @MyTableVar
SELECT c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY c.LastName, c.FirstName;
SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
GO
C.Wstawianie danych zwróconych przez wyjściowy klauzula
Poniższy przykład przechwytuje dane zwrócone z WYJŚCIOWEGO klauzula korespondencji seryjnej instrukcjai wstawia dane do innej tabela.Aktualizacje instrukcja korespondencji seryjnej Quantity kolumna ProductInventory tabela codziennie, na podstawie zamówień, które są przetwarzane w SalesOrderDetail tabela.Usuwa również wiersze dla produktów, których zapasy upuszczania na 0.Przykład przechwytuje wierszy, które są usuwane i wstawi je do innej tabela, ZeroInventory, ścieżek produktów o braku zapasów.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL
DROP TABLE Production.ZeroInventory;
GO
--Create ZeroInventory table.
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);
GO
INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)
SELECT ProductID, GETDATE()
FROM
( MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = '20070401'
GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)
WHERE Action = 'DELETE';
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were inserted';
GO
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;