Udostępnij za pośrednictwem


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.

PrzestrogaPrzestroga

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;