INSERT (Transact-SQL)INSERT (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simAzure Synapse Analytics (SQL DW) simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Adiciona uma ou mais linhas a uma tabela ou exibição no SQL ServerSQL Server.Adds one or more rows to a table or a view in SQL ServerSQL Server. Para obter exemplos, confira Exemplos.For examples, see Examples.

Ícone de link do tópico Convenções de sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [ ,...n ] ]  
INSERT   
{  
        [ TOP ( expression ) [ PERCENT ] ]   
        [ INTO ]   
        { <object> | rowset_function_limited   
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
        }  
    {  
        [ ( column_list ) ]   
        [ <OUTPUT Clause> ]  
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ]   
        | derived_table   
        | execute_statement  
        | <dml_table_source>  
        | DEFAULT VALUES   
        }  
    }  
}  
[;]  
  
<object> ::=  
{   
    [ server_name . database_name . schema_name .   
      | database_name .[ schema_name ] .   
      | schema_name .   
    ]  
  table_or_view_name  
}  
  
<dml_table_source> ::=  
    SELECT <select_list>  
    FROM ( <dml_statement_with_output_clause> )   
      [AS] table_alias [ ( column_alias [ ,...n ] ) ]  
    [ WHERE <search_condition> ]  
        [ OPTION ( <query_hint> [ ,...n ] ) ]  
-- External tool only syntax  

INSERT   
{  
    [BULK]  
    { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }  
    ( <column_definition> )  
    [ WITH (  
        [ [ , ] CHECK_CONSTRAINTS ]  
        [ [ , ] FIRE_TRIGGERS ]  
        [ [ , ] KEEP_NULLS ]  
        [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]  
        [ [ , ] ROWS_PER_BATCH = rows_per_batch ]  
        [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]  
        [ [ , ] TABLOCK ]  
    ) ]  
}  
  
[; ] <column_definition> ::=  
 column_name <data_type>  
    [ COLLATE collation_name ]  
    [ NULL | NOT NULL ]  
  
<data type> ::=   
[ type_schema_name . ] type_name   
    [ ( precision [ , scale ] | max ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

INSERT INTO { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ( column_name [ ,...n ] ) ]  
    {   
      VALUES ( { NULL | expression } )  
      | SELECT <select_criteria>  
    }  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
[;]  

ArgumentosArguments

WITH <common_table_expression>WITH <common_table_expression>
Especifica o conjunto de resultados nomeado temporário, também conhecido como expressão de tabela comum, definido dentro do escopo da instrução INSERT.Specifies the temporary named result set, also known as common table expression, defined within the scope of the INSERT statement. O conjunto de resultados é derivado de uma instrução SELECT.The result set is derived from a SELECT statement. Para obter mais informações, confira WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]TOP (expression) [ PERCENT ]
Especifica o número ou a porcentagem de linhas aleatórias que serão inseridas.Specifies the number or percent of random rows that will be inserted. expression pode ser um número ou uma porcentagem das linhas.expression can be either a number or a percent of the rows. Para obter mais informações, confira TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

INTOINTO
É uma palavra-chave opcional que pode ser usada entre INSERT e a tabela de destino.Is an optional keyword that can be used between INSERT and the target table.

server_nameserver_name
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

É o nome do servidor vinculado no qual a tabela ou exibição especificada está localizada.Is the name of the linked server on which the table or view is located. server_name pode ser especificado como o nome do servidor vinculado ou com a função OPENDATASOURCE.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

Quando server_name é especificado como um servidor vinculado, database_name e schema_name são obrigatórios.When server_name is specified as a linked server, database_name and schema_name are required. Quando server_name é especificado com OPENDATASOURCE, database_name e schema_name podem não se aplicar a todas as fontes de dados e podem estar sujeitos às funcionalidades do Provedor OLE DB que acessa o objeto remoto.When server_name is specified with OPENDATASOURCE, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

database_namedatabase_name
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

É o nome do banco de dados.Is the name of the database.

schema_nameschema_name
É o nome do esquema ao qual a tabela ou exibição pertence.Is the name of the schema to which the table or view belongs.

table_or view_nametable_or view_name
É o nome da tabela ou exibição que irá receber os dados.Is the name of the table or view that is to receive the data.

Uma variável table, dentro de seu escopo, pode ser usada como uma origem de tabela em uma instrução INSERT.A table variable, within its scope, can be used as a table source in an INSERT statement.

A exibição referenciada por table_or_view_name precisa ser atualizável e referenciar exatamente uma tabela base na cláusula FROM da exibição.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. Por exemplo, um INSERT em uma exibição de várias tabelas deve usar uma column_list que referencia apenas colunas de uma tabela base.For example, an INSERT into a multi-table view must use a column_list that references only columns from one base table. Para obter mais informações sobre exibições atualizáveis, consulte CREATE VIEW (Transact-SQL).For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

É a função OPENQUERY ou OPENROWSET.Is either the OPENQUERY or OPENROWSET function. O uso dessas funções está sujeito aos recursos do provedor OLE DB que acessa o objeto remoto.Use of these functions is subject to the capabilities of the OLE DB provider that accesses the remote object.

WITH ( <table_hint_limited> [... n ] )WITH ( <table_hint_limited> [... n ] )
Especifica uma ou mais dicas de tabela permitidas para uma tabela de destino.Specifies one or more table hints that are allowed for a target table. A palavra-chave WITH e parênteses são necessários.The WITH keyword and the parentheses are required.

READPAST, NOLOCK e READUNCOMMITTED não são permitidos.READPAST, NOLOCK, and READUNCOMMITTED are not allowed. Para obter mais informações sobre dicas de tabela, consulte Dicas de tabela (Transact-SQL).For more information about table hints, see Table Hints (Transact-SQL).

Importante

A capacidade de especificar as dicas HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD ou UPDLOCK em tabelas que são destinos de instruções INSERT será removida em uma versão futura do SQL ServerSQL Server.The ability to specify the HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD, or UPDLOCK hints on tables that are targets of INSERT statements will be removed in a future version of SQL ServerSQL Server. Essas dicas não afetam o desempenho de instruções INSERT.These hints do not affect the performance of INSERT statements. Evite usá-las em novos projetos de desenvolvimento e planeje modificar os aplicativos que as utilizam atualmente.Avoid using them in new development work, and plan to modify applications that currently use them.

Especificar a dica TABLOCK em uma tabela que é o destino de uma instrução INSERT tem o mesmo efeito de especificar a dica TABLOCKX.Specifying the TABLOCK hint on a table that is the target of an INSERT statement has the same effect as specifying the TABLOCKX hint. Um bloqueio exclusivo é obtido na tabela.An exclusive lock is taken on the table.

(column_list)(column_list)
É uma lista de uma ou mais colunas onde os dados devem ser inseridos.Is a list of one or more columns in which to insert data. column_list deve ser colocada entre parênteses e separada por vírgulas.column_list must be enclosed in parentheses and delimited by commas.

Se uma coluna não estiver na column_list, o Mecanismo de Banco de DadosDatabase Engine deverá poder fornecer um valor baseado na definição da coluna; caso contrário, a linha não poderá ser carregada.If a column is not in column_list, the Mecanismo de Banco de DadosDatabase Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded. O Mecanismo de Banco de DadosDatabase Engine fornecerá um valor automaticamente para a coluna, se a coluna:The Mecanismo de Banco de DadosDatabase Engine automatically provides a value for the column if the column:

  • Tiver uma propriedade IDENTITY.Has an IDENTITY property. O próximo valor de identidade incremental for usado.The next incremental identity value is used.

  • Tiver um padrão.Has a default. O valor padrão da coluna for usado.The default value for the column is used.

  • Tem um tipo de dados timestamp.Has a timestamp data type. O valor do carimbo de data/hora atual for usado.The current timestamp value is used.

  • Permite valor nulo.Is nullable. Um valor nulo for usado.A null value is used.

  • For uma coluna computada.Is a computed column. O valor calculado for usado.The calculated value is used.

column_list deve ser usada quando valores explícitos são inseridos em uma coluna de identidade e a opção SET IDENTITY_INSERT deve ser ON para a tabela.column_list must be used when explicit values are inserted into an identity column, and the SET IDENTITY_INSERT option must be ON for the table.

Cláusula OUTPUTOUTPUT Clause
Retorna linhas inseridas como parte da operação de inserção.Returns inserted rows as part of the insert operation. Os resultados podem ser retornados ao aplicativo de processamento ou inseridos em uma tabela ou variável de tabela para processamento futuro.The results can be returned to the processing application or inserted into a table or table variable for further processing.

Não há compatibilidade com a cláusula OUTPUT em instruções DML que referenciam exibições particionadas locais, exibições particionadas distribuídas, tabelas remotas ou instruções INSERT que contêm uma execute_statement.The OUTPUT clause is not supported in DML statements that reference local partitioned views, distributed partitioned views, or remote tables, or INSERT statements that contain an execute_statement. A cláusula OUTPUT INTO não é compatível com instruções INSERT que contêm uma cláusula <dml_table_source>.The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

VALUESVALUES
Apresenta a(s) lista(s) de valores de dados a serem inseridos.Introduces the list or lists of data values to be inserted. Deve haver um valor de dados para cada coluna em column_list, se especificado, ou na tabela.There must be one data value for each column in column_list, if specified, or in the table. A lista de valores deve ser colocada entre parênteses.The value list must be enclosed in parentheses.

Se os valores na lista Value não estiverem na mesma ordem que as colunas na tabela ou se não tiverem um valor para cada coluna da tabela, column_list deverá ser usado para especificar explicitamente a coluna que armazena cada valor de entrada.If the values in the Value list are not in the same order as the columns in the table or do not have a value for each column in the table, column_list must be used to explicitly specify the column that stores each incoming value.

É possível usar o construtor de linhas do Transact-SQLTransact-SQL (também chamado construtor de valor de tabela) para especificar várias linhas em uma única instrução INSERT.You can use the Transact-SQLTransact-SQL row constructor (also called a table value constructor) to specify multiple rows in a single INSERT statement. O construtor de linhas consiste em uma única cláusula VALUES com várias listas de valores entre parênteses e separados por uma vírgula.The row constructor consists of a single VALUES clause with multiple value lists enclosed in parentheses and separated by a comma. Para obter mais informações, consulte Construtor de valor de tabela (Transact-SQL).For more information, see Table Value Constructor (Transact-SQL).

DEFAULTDEFAULT
Força o Mecanismo de Banco de DadosDatabase Engine a carregar o valor padrão definido para uma coluna.Forces the Mecanismo de Banco de DadosDatabase Engine to load the default value defined for a column. Se não existir um padrão para a coluna e a coluna aceitar valores nulos, NULL será inserido.If a default does not exist for the column and the column allows null values, NULL is inserted. Para uma coluna definida com o tipo de dados timestamp, o próximo valor do carimbo de data/hora é inserido.For a column defined with the timestamp data type, the next timestamp value is inserted. DEFAULT não é válido para uma coluna de identidade.DEFAULT is not valid for an identity column.

expressãoexpression
É uma constante, uma variável ou uma expressão.Is a constant, a variable, or an expression. A expressão não pode conter uma instrução EXECUTE.The expression cannot contain an EXECUTE statement.

Ao referenciar os tipos de dados de caractere Unicode nchar, nvarchar e ntext, 'expression' deve ter a letra maiúscula 'N' como prefixo.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. Se N não for especificado, o SQL ServerSQL Server converte a cadeia na página de código correspondente à ordenação padrão do banco de dados ou coluna.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. Qualquer caractere não localizado nessa página de código será perdido.Any characters not found in this code page are lost.

derived_tablederived_table
É qualquer instrução SELECT válida que retorne linhas de dados a serem carregadas na tabela.Is any valid SELECT statement that returns rows of data to be loaded into the table. A instrução SELECT não pode conter uma CTE (expressão de tabela comum).The SELECT statement cannot contain a common table expression (CTE).

execute_statementexecute_statement
É qualquer instrução EXECUTE que retorne dados com instruções SELECT ou READTEXT.Is any valid EXECUTE statement that returns data with SELECT or READTEXT statements. Para obter mais informações, veja EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

As opções de RESULT SETS da instrução EXECUTE não podem ser especificadas em uma instrução INSERT...EXEC.The RESULT SETS options of the EXECUTE statement cannot be specified in an INSERT...EXEC statement.

Se execute_statement for usado com INSERT, cada conjunto de resultados deverá ser compatível com as colunas da tabela ou da column_list.If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list.

execute_statement pode ser usado para executar procedimentos armazenados no mesmo servidor ou em um servidor remoto.execute_statement can be used to execute stored procedures on the same server or a remote server. O procedimento no servidor remoto é executado e os conjuntos de resultados são retornados ao servidor local e carregados na tabela no servidor local.The procedure in the remote server is executed, and the result sets are returned to the local server and loaded into the table in the local server. Em uma transação distribuída, execute_statement não pode ser emitido em um servidor vinculado de loopback quando a conexão tem vários MARS (conjuntos de resultados ativos múltiplos) habilitados.In a distributed transaction, execute_statement cannot be issued against a loopback linked server when the connection has multiple active result sets (MARS) enabled.

Se execute_statement retornar dados com a instrução READTEXT, cada instrução READTEXT poderá retornar, no máximo, 1 MB (1.024 KB) de dados.If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data. execute_statement também pode ser usada com procedimentos estendidos.execute_statement can also be used with extended procedures. execute_statement insere os dados retornados pelo thread principal do procedimento estendido; porém, a saída de threads diferente do thread principal não é inserida.execute_statement inserts the data returned by the main thread of the extended procedure; however, output from threads other than the main thread are not inserted.

Você não pode especificar um parâmetro avaliado por tabela como o destino de uma instrução INSERT EXEC; porém, ele pode ser especificado como uma origem na cadeia de caracteres INSERT EXEC ou procedimento armazenado.You cannot specify a table-valued parameter as the target of an INSERT EXEC statement; however, it can be specified as a source in the INSERT EXEC string or stored-procedure. Para obter mais informações, veja Usar parâmetros com valor de tabela (Mecanismo de Banco de Dados).For more information, see Use Table-Valued Parameters (Database Engine).

<dml_table_source><dml_table_source>
Especifica que as linhas inseridas na tabela de destino são as retornadas pela cláusula OUTPUT de uma instrução INSERT, UPDATE, DELETE ou MERGE, opcionalmente filtradas por uma cláusula WHERE.Specifies that the rows inserted into the target table are those returned by the OUTPUT clause of an INSERT, UPDATE, DELETE, or MERGE statement, optionally filtered by a WHERE clause. Se <dml_table_source> for especificado, o destino da instrução INSERT externa deverá atender às seguintes restrições:If <dml_table_source> is specified, the target of the outer INSERT statement must meet the following restrictions:

  • Deve ser uma tabela base, não uma exibição.It must be a base table, not a view.

  • Não pode ser uma tabela remota.It cannot be a remote table.

  • Não pode ter gatilhos definidos.It cannot have any triggers defined on it.

  • Não pode participar de relações de chave primária/chave estrangeira.It cannot participate in any primary key-foreign key relationships.

  • Não pode participar de replicação de mesclagem ou de assinaturas atualizáveis para replicação transacional.It cannot participate in merge replication or updatable subscriptions for transactional replication.

O nível de compatibilidade do banco de dados deve ser definido como 100 ou superior.The compatibility level of the database must be set to 100 or higher. Para obter mais informações, confira Cláusula OUTPUT (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

<select_list><select_list>
É uma lista separada por vírgulas que especifica quais colunas retornadas pela cláusula OUTPUT devem ser inseridas.Is a comma-separated list specifying which columns returned by the OUTPUT clause to insert. As colunas de <select_list> devem ser compatíveis com as colunas nas quais os valores estão sendo inseridos.The columns in <select_list> must be compatible with the columns into which values are being inserted. <select_list> não pode referenciar funções de agregação nem TEXTPTR.<select_list> cannot reference aggregate functions or TEXTPTR.

Observação

Todas as variáveis listadas na lista SELECT referem-se a seus valores originais, independentemente das alterações feita nelas em <dml_statement_with_output_clause>.Any variables listed in the SELECT list refer to their original values, regardless of any changes made to them in <dml_statement_with_output_clause>.

<dml_statement_with_output_clause><dml_statement_with_output_clause>
É uma instrução INSERT, UPDATE, DELETE ou MERGE válida que retorna linhas afetadas em uma cláusula OUTPUT.Is a valid INSERT, UPDATE, DELETE, or MERGE statement that returns affected rows in an OUTPUT clause. A instrução não pode conter uma cláusula WITH nem pode ter como destino tabelas remotas ou exibições particionadas.The statement cannot contain a WITH clause, and cannot target remote tables or partitioned views. Se UPDATE ou DELETE for especificada, ela não poderá ser uma instrução UPDATE ou DELETE baseada em cursor.If UPDATE or DELETE is specified, it cannot be a cursor-based UPDATE or DELETE. Linhas de origem não podem ser referenciadas como instruções DML aninhadas.Source rows cannot be referenced as nested DML statements.

WHERE <search_condition>WHERE <search_condition>
É qualquer cláusula WHERE que contém um <search_condition> válido que filtra as linhas retornadas por <dml_statement_with_output_clause>.Is any WHERE clause containing a valid <search_condition> that filters the rows returned by <dml_statement_with_output_clause>. Para obter mais informações, consulte Condição de pesquisa (Transact-SQL).For more information, see Search Condition (Transact-SQL). Quando usado nesse contexto, <search_condition> não pode conter subconsultas, funções escalares definidas pelo usuário que executam o acesso a dados, funções de agregação, TEXTPTR nem predicados de pesquisa de texto completo.When used in this context, <search_condition> cannot contain subqueries, scalar user-defined functions that perform data access, aggregate functions, TEXTPTR, or full-text search predicates.

DEFAULT VALUESDEFAULT VALUES
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Força a nova linha a conter os valores padrão definidos para cada coluna.Forces the new row to contain the default values defined for each column.

BULKBULK
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Usado por ferramentas externas para carregar um fluxo de dados binários.Used by external tools to upload a binary data stream. Esta opção não se destina ao uso com ferramentas como SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL ou interfaces de programação de aplicativo de acesso a dados, como o SQL ServerSQL Server Native Client.This option is not intended for use with tools such as SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL, or data access application programming interfaces such as SQL ServerSQL Server Native Client.

FIRE_TRIGGERSFIRE_TRIGGERS
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Especifica que qualquer gatilho de inserção definido na tabela de destino seja executado durante a operação de carregamento de fluxo de dados binários.Specifies that any insert triggers defined on the destination table execute during the binary data stream upload operation. Para obter mais informações, veja BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTSCHECK_CONSTRAINTS
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Especifica que todas as restrições na tabela ou exibição de destino devem ser verificadas durante a operação de carregamento de fluxo de dados binários.Specifies that all constraints on the target table or view must be checked during the binary data stream upload operation. Para obter mais informações, veja BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

KEEPNULLSKEEPNULLS
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Especifica que as colunas vazias devem reter um valor nulo durante a operação de carregamento de fluxo de dados binários.Specifies that empty columns should retain a null value during the binary data stream upload operation. Para obter mais informações, veja Manter valores nulos ou usar os valores padrão durante a importação em massa (SQL Server).For more information, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batchKILOBYTES_PER_BATCH = kilobytes_per_batch
Especifica o número aproximado de KB (kilobytes) de dados por lote como kilobytes_per_batch.Specifies the approximate number of kilobytes (KB) of data per batch as kilobytes_per_batch. Para obter mais informações, veja BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batchROWS_PER_BATCH =rows_per_batch
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Indica o número aproximado de linhas de dados no fluxo de dados binários.Indicates the approximate number of rows of data in the binary data stream. Para obter mais informações, veja BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

Observação

Um erro de sintaxe é gerado se uma lista de colunas não é fornecida.A syntax error is raised if a column list is not provided.

RemarksRemarks

Para obter informações específicas à inserção de dados em tabelas de grafo do SQL, consulte INSERT (SQL Graph).For information specific to inserting data into SQL graph tables, see INSERT (SQL Graph).

Práticas recomendadasBest Practices

Use a função @@ROWCOUNT para retornar o número de linhas inseridas no aplicativo cliente.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. Para obter mais informações, consulte @@ROWCOUNT (Transact-SQL).For more information, see @@ROWCOUNT (Transact-SQL).

Práticas recomendadas para importar dados em massaBest Practices for Bulk Importing Data

Usando INSERT INTO...SELECT em importação de dados em massa com log mínimoUsing INSERT INTO...SELECT to Bulk Import Data with Minimal Logging

Use INSERT INTO <target_table> SELECT <columns> FROM <source_table> para transferir com eficiência um grande número de linhas de uma tabela, como uma tabela de preparo, para outra tabela com log mínimo.You can use INSERT INTO <target_table> SELECT <columns> FROM <source_table> to efficiently transfer a large number of rows from one table, such as a staging table, to another table with minimal logging. O log mínimo pode melhorar o desempenho da instrução e reduzir a possibilidade de a operação preencher o espaço de log disponível durante a transação.Minimal logging can improve the performance of the statement and reduce the possibility of the operation filling the available transaction log space during the transaction.

O log mínimo dessa instrução possui os seguintes requisitos:Minimal logging for this statement has the following requirements:

  • O modelo de recuperação do banco de dados é definido como simples ou bulk-logged.The recovery model of the database is set to simple or bulk-logged.

  • A tabela de destino é um heap vazio ou não vazio.The target table is an empty or nonempty heap.

  • A tabela de destino não é usada na replicação.The target table is not used in replication.

  • A dica TABLOCK é especificada para a tabela de destino.The TABLOCK hint is specified for the target table.

As linhas inseridas em um heap como o resultado de uma ação de inserção em uma instrução MERGE também podem ser minimamente registradas.Rows that are inserted into a heap as the result of an insert action in a MERGE statement may also be minimally logged.

Diferentemente da instrução BULK INSERT, que contém um bloqueio de atualização em massa menos restritivo, INSERT INTO...SELECT com a dica TABLOCK contém um bloqueio exclusivo (X) na tabela.Unlike the BULK INSERT statement, which holds a less restrictive Bulk Update lock, INSERT INTO...SELECT with the TABLOCK hint holds an exclusive (X) lock on the table. Isso significa que você não pode inserir linhas usando operações de inserção paralelas.This means that you cannot insert rows using parallel insert operations.

Usando OPENROWSET e BULK para importação de dados em massaUsing OPENROWSET and BULK to Bulk Import Data

A função OPENROWSET pode aceitar as seguintes dicas de tabela, que fornecem otimizações de carregamento em massa com a instrução INSERT:The OPENROWSET function can accept the following table hints, which provide bulk-load optimizations with the INSERT statement:

  • A dica TABLOCK pode minimizar o número de registros de log para a operação de inserção.The TABLOCK hint can minimize the number of log records for the insert operation. O modelo de recuperação do banco de dados deve ser definido como simples ou bulk-logged e a tabela de destino não pode ser usada na replicação.The recovery model of the database must be set to simple or bulk-logged and the target table cannot be used in replication. Para obter mais informações, confira Pré-requisitos para registro em log mínimo em importação em massa.For more information, see Prerequisites for Minimal Logging in Bulk Import.

  • A dica IGNORE_CONSTRAINTS pode desabilitar temporariamente a verificação de restrição FOREIGN KEY e CHECK.The IGNORE_CONSTRAINTS hint can temporarily disable FOREIGN KEY and CHECK constraint checking.

  • A dica IGNORE_TRIGGERS pode desabilitar temporariamente a execução de gatilhos.The IGNORE_TRIGGERS hint can temporarily disable trigger execution.

  • A dica KEEPDEFAULTS permite a inserção de um valor padrão da coluna de tabela, se houver algum, em vez de NULL, se o registro de dados não tiver um valor para a coluna.The KEEPDEFAULTS hint allows the insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

  • A dica KEEPIDENTITY permite que os valores de identidade no arquivo de dados importado sejam usados para a coluna de identidade na tabela de destino.The KEEPIDENTITY hint allows the identity values in the imported data file to be used for the identity column in the target table.

Essas otimizações são semelhantes àquelas disponíveis com o comando BULK INSERT.These optimizations are similar to those available with the BULK INSERT command. Para obter mais informações, consulte Dicas de tabela (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Tipos de dadosData Types

Quando você inserir linhas, considere o comportamento do seguinte tipo de dados:When you insert rows, consider the following data type behavior:

  • Se um valor estiver sendo carregado em colunas com um tipo de dados char, varchar ou varbinary, o preenchimento ou truncamento de espaços em branco à direita (espaços para char e varchar, zeros para varbinary) será determinado pela configuração de SET ANSI_PADDING definida para a coluna durante a criação da tabela.If a value is being loaded into columns with a char, varchar, or varbinary data type, the padding or truncation of trailing blanks (spaces for char and varchar, zeros for varbinary) is determined by the SET ANSI_PADDING setting defined for the column when the table was created. Para obter mais informações, veja SET ANSI_PADDING (Transact-SQL).For more information, see SET ANSI_PADDING (Transact-SQL).

    A tabela a seguir mostra a operação padrão de SET ANSI_PADDING OFF.The following table shows the default operation for SET ANSI_PADDING OFF.

    Tipo de dadosData type Operação padrãoDefault operation
    charchar Valor de preenchimento com espaços para a largura definida da coluna.Pad value with spaces to the defined width of column.
    varcharvarchar Remove espaços à direita do último caractere não-espaço ou do caractere de espaço único para cadeias de caracteres compostas apenas de espaços.Remove trailing spaces to the last non-space character or to a single-space character for strings made up of only spaces.
    varbinaryvarbinary Remova zeros à direita.Remove trailing zeros.
  • Se uma cadeia de caracteres vazia (' ') for carregada em uma coluna com um tipo de dados varchar ou text, a operação padrão será carregar uma cadeia de comprimento zero.If an empty string (' ') is loaded into a column with a varchar or text data type, the default operation is to load a zero-length string.

  • A inserção de um valor nulo em uma coluna text ou image não cria um ponteiro de texto válido, nem pré-aloca uma página de texto de 8 KB.Inserting a null value into a text or image column does not create a valid text pointer, nor does it preallocate an 8-KB text page.

  • Colunas criadas com o tipo de dados uniqueidentifier armazenam valores binários de 16 bytes especialmente formatados.Columns created with the uniqueidentifier data type store specially formatted 16-byte binary values. Ao contrário do que ocorre com as colunas de identidade, o Mecanismo de Banco de DadosDatabase Engine não gera automaticamente valores para colunas com o tipo de dados uniqueidentifier.Unlike with identity columns, the Mecanismo de Banco de DadosDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type. Durante uma operação de inserção, as variáveis com um tipo de dados uniqueidentifier e constantes de cadeia de caracteres no formato xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 caracteres, incluindo hifens, em que x é um dígito hexadecimal no intervalo 0-9 ou a-f) podem ser usadas para colunas uniqueidentifier.During an insert operation, variables with a data type of uniqueidentifier and string constants in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 characters including hyphens, where x is a hexadecimal digit in the range 0-9 or a-f) can be used for uniqueidentifier columns. Por exemplo, 6F9619FF-8B86-D011-B42D-00C04FC964FF é um valor válido para uma variável ou coluna uniqueidentifier.For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid value for a uniqueidentifier variable or column. Use a função NEWID() para obter um GUID (ID global exclusiva).Use the NEWID() function to obtain a globally unique ID (GUID).

Inserindo valores em colunas de tipo definido pelo usuárioInserting Values into User-Defined Type Columns

É possível inserir valores em colunas de tipo definido pelo usuário das seguintes maneiras:You can insert values in user-defined type columns by:

  • Fornecendo um valor do tipo definido pelo usuário.Supplying a value of the user-defined type.

  • Fornecendo um valor em um tipo de dados do sistema SQL ServerSQL Server, contanto que o tipo definido pelo usuário ofereça suporte à conversão implícita ou explícita do referido tipo.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. O exemplo a seguir mostra como inserir um valor em uma coluna de tipo definido pelo usuário Point com a conversão explícita de uma cadeia de caracteres.The following example shows how to insert a value in a column of user-defined type Point, by explicitly converting from a string.

    INSERT INTO Cities (Location)  
    VALUES ( CONVERT(Point, '12.3:46.2') );  
    

    Um valor binário também pode ser fornecido sem executar conversão explícita, porque todos os tipos definidos pelo usuário podem ser implicitamente convertidos de binário.A binary value can also be supplied without performing explicit conversion, because all user-defined types are implicitly convertible from binary.

  • Chamando uma função definida pelo usuário que retorna um valor do tipo definido pelo usuário.Calling a user-defined function that returns a value of the user-defined type. O exemplo a seguir usa uma função definida pelo usuário CreateNewPoint() para criar um novo valor de tipo definido pelo usuário Point e inserir o valor na tabela Cities.The following example uses a user-defined function CreateNewPoint() to create a new value of user-defined type Point and insert the value into the Cities table.

    INSERT INTO Cities (Location)  
    VALUES ( dbo.CreateNewPoint(x, y) );  
    

Tratamento de errosError Handling

Você pode implementar o tratamento de erro para a instrução INSERT especificando essa instrução em um constructo TRY...CATCH.You can implement error handling for the INSERT statement by specifying the statement in a TRY...CATCH construct.

Se uma instrução INSERT violar uma restrição ou regra ou se ela tiver um valor incompatível com o tipo de dados da coluna, a instrução falhará e uma mensagem de erro será retornada.If an INSERT statement violates a constraint or rule, or if it has a value incompatible with the data type of the column, the statement fails and an error message is returned.

Se INSERT estiver carregando várias linhas com SELECT ou EXECUTE, qualquer violação de uma regra ou restrição que ocorra nos valores que estão sendo carregados faz com que a instrução seja interrompida e nenhuma linha seja carregada.If INSERT is loading multiple rows with SELECT or EXECUTE, any violation of a rule or constraint that occurs from the values being loaded causes the statement to be stopped, and no rows are loaded.

Quando uma instrução INSERT encontra um erro aritmético (estouro, divisão por zero ou um erro de domínio) que ocorre durante a avaliação da expressão, o Mecanismo de Banco de DadosDatabase Engine trata esses erros como se a opção SET ARITHABORT estivesse definida como ON.When an INSERT statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the Mecanismo de Banco de DadosDatabase Engine handles these errors as if SET ARITHABORT is set to ON. O lote é interrompido e uma mensagem de erro é retornada.The batch is stopped, and an error message is returned. Durante a avaliação da expressão, quando SET ARITHABORT e SET ANSI_WARNINGS estão definidas como OFF, se uma instrução INSERT, DELETE ou UPDATE encontrar um erro aritmético, de estouro, de divisão por zero ou um erro de domínio, o SQL ServerSQL Server irá inserir ou atualizar um valor NULL.During expression evaluation when SET ARITHABORT and SET ANSI_WARNINGS are OFF, if an INSERT, DELETE or UPDATE statement encounters an arithmetic error, overflow, divide-by-zero, or a domain error, SQL ServerSQL Server inserts or updates a NULL value. Se a coluna de destino não for anulável, a ação de inserção ou atualização falhará e o usuário receberá uma mensagem de erro.If the target column is not nullable, the insert or update action fails and the user receives an error.

InteroperabilidadeInteroperability

Quando um gatilho INSTEAD OF é definido em ações INSERT em uma tabela ou exibição, o gatilho é executado em vez da instrução INSERT.When an INSTEAD OF trigger is defined on INSERT actions against a table or view, the trigger executes instead of the INSERT statement. Para obter mais informações sobre gatilhos INSTEAD OF, confira CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Limitações e RestriçõesLimitations and Restrictions

Quando você insere valores em tabelas remotas e nem todos os valores de todas as colunas são especificados, é necessário identificar as colunas para as quais os valores devem ser inseridos.When you insert values into remote tables and not all values for all columns are specified, you must identify the columns to which the specified values are to be inserted.

Quando TOP é usado com INSERT, as linhas referenciadas não são organizadas em nenhuma ordem e a cláusula ORDER BY não pode ser especificada diretamente nessas instruções.When TOP is used with INSERT the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statements. Se você precisar usar TOP para inserir linhas em uma ordem cronológica significativa, deverá usar TOP junto com uma cláusula ORDER BY especificada em uma instrução de subseleção.If you need to use TOP to insert rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause that is specified in a subselect statement. Consulte a seção Exemplos a seguir neste tópico.See the Examples section that follows in this topic.

Consultas INSERT que usam SELECT com ORDER BY para popular linhas garantem a forma como os valores de identidade são calculados, mas não a ordem na qual as linhas são inseridas.INSERT queries that use SELECT with ORDER BY to populate rows guarantees how identity values are computed but not the order in which the rows are inserted.

No Parallel Data Warehouse, a cláusula ORDER BY será inválida em VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, funções embutidas, tabelas derivadas, subconsultas e expressões de tabela comuns, a menos que TOP também esteja especificado.In Parallel Data Warehouse, the ORDER BY clause is invalid in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, derived tables, subqueries and common table expressions, unless TOP is also specified.

Comportamento de logLogging Behavior

A instrução INSERT é sempre totalmente registrada em log, exceto ao usar a função OPENROWSET com a palavra-chave BULK ou ao usar INSERT INTO <target_table> SELECT <columns> FROM <source_table>.The INSERT statement is always fully logged except when using the OPENROWSET function with the BULK keyword or when using INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Essas operações podem ser registradas minimamente.These operations can be minimally logged. Para obter mais informações, consulte a seção "Práticas recomendadas para o carregamento de dados em massa" anteriormente neste tópico.For more information, see the section "Best Practices for Bulk Loading Data" earlier in this topic.

SegurançaSecurity

Durante uma conexão de servidor vinculado, o servidor de envio fornece um nome de logon e uma senha para conexão com o servidor de recebimento em seu nome.During a linked server connection, the sending server provides a login name and password to connect to the receiving server on its behalf. Para que essa conexão funcione, é necessário criar um mapeamento de logon entre os servidores vinculados usando sp_addlinkedsrvlogin.For this connection to work, you must create a login mapping between the linked servers by using sp_addlinkedsrvlogin.

Quando você usar OPENROWSET(BULK…), é importante entender como o SQL ServerSQL Server manipula a representação.When you use OPENROWSET(BULK...), it is important to understand how SQL ServerSQL Server handles impersonation. Para obter mais informações, consulte "Considerações sobre segurança" em Importar dados em massa usando BULK INSERT ou OPENROWSET(BULK...) (SQL Server).For more information, see "Security Considerations" in Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

PermissõesPermissions

A permissão INSERT é necessária na tabela de destino.INSERT permission is required on the target table.

As permissões INSERT usam como padrão os membros da função de servidor fixa sysadmin, as funções de banco de dados fixa db_owner e db_datawriter e o proprietário da tabela.INSERT permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Os membros das funções sysadmin, db_owner e db_securityadmin e o proprietário da tabela podem transferir permissões para outros usuários.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

Para executar INSERT com a opção BULK da função OPENROWSET, você precisa ser membro da função de servidor fixa sysadmin ou bulkadmin.To execute INSERT with the OPENROWSET function BULK option, you must be a member of the sysadmin fixed server role or of the bulkadmin fixed server role.

ExemplosExamples

CategoriaCategory Elementos de sintaxe em destaqueFeatured syntax elements
Sintaxe básicaBasic syntax INSERT • construtor de valor de tabelaINSERT • table value constructor
Manipulando valores de colunaHandling column values IDENTITY • NEWID • valores padrão • Tipos definidos pelo usuárioIDENTITY • NEWID • default values • user-defined types
Inserindo dados de outras tabelasInserting data from other tables INSERT…SELECT • INSERT…EXECUTE • expressão de tabela comum WITH • TOP • OFFSET FETCHINSERT...SELECT • INSERT...EXECUTE • WITH common table expression • TOP • OFFSET FETCH
Especificando objetos de destino que não sejam de tabelas padrãoSpecifying target objects other than standard tables Exibições • variáveis de tabelaViews • table variables
Inserindo linhas em uma tabela remotaInserting rows into a remote table Servidor vinculado • Função de conjunto de linhas OPENQUERY • Função de conjunto de linhas OPENDATASOURCELinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Carregamento de dados em massa por meio de tabelas ou arquivos de dadosBulk loading data from tables or data files INSERT…SELECT • Função OPENROWSETINSERT...SELECT • OPENROWSET function
Substituindo o comportamento padrão do otimizador de consulta usando dicasOverriding the default behavior of the query optimizer by using hints Dicas de tabelaTable hints
Capturando os resultados da instrução INSERTCapturing the results of the INSERT statement cláusula OUTPUTOUTPUT clause

Sintaxe básicaBasic Syntax

Os exemplos nesta seção demonstram a funcionalidade básica da instrução INSERT usando a sintaxe mínima necessária.Examples in this section demonstrate the basic functionality of the INSERT statement using the minimum required syntax.

A.A. Inserindo uma única linha de dadosInserting a single row of data

O exemplo a seguir insere uma linha na tabela Production.UnitMeasure do banco de dados AdventureWorks2012AdventureWorks2012.The following example inserts one row into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. As colunas nesta tabela são UnitMeasureCode, Name e ModifiedDate.The columns in this table are UnitMeasureCode, Name, and ModifiedDate. Como os valores de todas as colunas são fornecidos e listados na mesma ordem que as colunas da tabela, os nomes das colunas não precisam ser especificados na lista de colunas .Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list .

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  

B.B. Inserindo várias linhas de dadosInserting multiple rows of data

O exemplo a seguir usa o construtor de valor de tabela para inserir três linhas na tabela Production.UnitMeasure do banco de dados AdventureWorks2012AdventureWorks2012 em uma única instrução INSERT.The following example uses the table value constructor to insert three rows into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database in a single INSERT statement. Como os valores de todas as colunas são fornecidos e listados na mesma ordem que as colunas da tabela, os nomes das colunas não precisam ser especificados na lista de colunas.Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  

C.C. Inserindo dados que não estão na mesma ordem que as colunas da tabelaInserting data that is not in the same order as the table columns

O exemplo a seguir usa uma lista de colunas para especificar explicitamente os valores inseridos em cada coluna.The following example uses a column list to explicitly specify the values that are inserted into each column. A ordem das colunas na tabela Production.UnitMeasure do banco de dados AdventureWorks2012AdventureWorks2012 é UnitMeasureCode, Name, ModifiedDate. No entanto, as colunas não estão listadas nessa ordem em column_list.The column order in the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database is UnitMeasureCode, Name, ModifiedDate; however, the columns are not listed in that order in column_list.

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  

Manipulando valores de colunaHandling Column Values

Os exemplos desta seção demonstram métodos para a inserção de valores em colunas definidas com uma propriedade IDENTITY, o valor DEFAULT ou que são definidas com tipos de dados como uniqueidentifier ou colunas de tipo definido pelo usuário.Examples in this section demonstrate methods of inserting values into columns that are defined with an IDENTITY property, DEFAULT value, or are defined with data types such as uniqueidentifer or user-defined type columns.

D.D. Inserindo dados em uma tabela com colunas que têm valores padrãoInserting data into a table with columns that have default values

O exemplo a seguir mostra como inserir linhas em uma tabela com colunas que geram automaticamente um valor ou têm um valor padrão.The following example shows inserting rows into a table with columns that automatically generate a value or have a default value. Column_1 é uma coluna computada que gera automaticamente um valor concatenando uma cadeia de caracteres com o valor inserido em column_2.Column_1 is a computed column that automatically generates a value by concatenating a string with the value inserted into column_2. Column_2 é definido com uma restrição padrão.Column_2 is defined with a default constraint. Se um valor não for especificado para essa coluna, o valor padrão será usado.If a value is not specified for this column, the default value is used. Column_3 é definido com o tipo de dados rowversion, que gera automaticamente um número binário exclusivo de incremento.Column_3 is defined with the rowversion data type, which automatically generates a unique, incrementing binary number. Column_4 não gera um valor automaticamente.Column_4 does not automatically generate a value. Quando um valor para esta coluna não é especificado, NULL é inserido.When a value for this column is not specified, NULL is inserted. As instruções INSERT inserem linhas que contêm valores para algumas das colunas, mas não todas.The INSERT statements insert rows that contain values for some of the columns but not all. Na última instrução INSERT, nenhuma coluna é especificada e somente os valores padrão são inseridos com o uso da cláusula DEFAULT VALUES.In the last INSERT statement, no columns are specified and only the default values are inserted by using the DEFAULT VALUES clause.

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  

E.E. Inserindo dados em uma tabela com uma coluna de identidadeInserting data into a table with an identity column

O exemplo a seguir mostra métodos diferentes para inserção de dados em uma coluna de identidade.The following example shows different methods of inserting data into an identity column. As primeiras duas instruções INSERT permitem identificar valores de identidade a serem gerados para as novas linhas.The first two INSERT statements allow identity values to be generated for the new rows. A terceira instrução INSERT substitui a propriedade IDENTITY da coluna com a instrução SET IDENTITY_INSERT e insere um valor explícito na coluna de identidade.The third INSERT statement overrides the IDENTITY property for the column with the SET IDENTITY_INSERT statement and inserts an explicit value into the identity column.

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  

F.F. Inserindo dados em uma coluna uniqueidentifier usando NEWID()Inserting data into a uniqueidentifier column by using NEWID()

O exemplo a seguir usa a função NEWID() para obter um GUID para column_2.The following example uses the NEWID() function to obtain a GUID for column_2. Ao contrário do que acontece com colunas de identidade, o Mecanismo de Banco de DadosDatabase Engine não gera valores automaticamente para colunas com o tipo de dados uniqueidentifier, conforme mostrado pela segunda instrução INSERT.Unlike for identity columns, the Mecanismo de Banco de DadosDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type, as shown by the second INSERT statement.

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;  
  

G.G. Inserindo dados em colunas de tipo definido pelo usuárioInserting data into user-defined type columns

As instruções Transact-SQLTransact-SQL a seguir inserem três linhas na coluna PointValue da tabela Points.The following Transact-SQLTransact-SQL statements insert three rows into the PointValue column of the Points table. Essa coluna usa um UDT (tipo de dado CLR definido pelo usuário).This column uses a CLR user-defined type (UDT). O tipo de dados Point consiste em valores inteiros de X e Y que são expostos como propriedades do UDT.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. Você deve usar a função CAST ou CONVERT para converter os valores X e Y delimitados por vírgulas no tipo Point.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. As duas primeiras instruções usam a função CONVERT para converter um valor de cadeia de caracteres no tipo Point e a terceira instrução usa a função CAST.The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function. Para obter mais informações, consulte Manipulando dados de UDT.For more information, see Manipulating UDT Data.

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));  

Inserindo dados de outras tabelasInserting Data from Other Tables

Os exemplos nesta seção demonstram métodos para a inserção de linhas de uma tabela em outra tabela.Examples in this section demonstrate methods of inserting rows from one table into another table.

H.H. Usando as opções SELECT e EXECUTE para inserir dados de outras tabelasUsing the SELECT and EXECUTE options to insert data from other tables

O exemplo a seguir mostra como inserir dados de uma tabela em outra tabela usando INSERT...SELECT ou INSERT...EXECUTE.The following example shows how to insert data from one table into another table by using INSERT...SELECT or INSERT...EXECUTE. Cada um é baseado em uma instrução SELECT de várias tabelas que inclui uma expressão e um valor literal na lista de colunas.Each is based on a multi-table SELECT statement that includes an expression and a literal value in the column list.

A primeira instrução INSERT usa uma instrução SELECT para obter os dados das tabelas de origem (Employee, SalesPerson e Person) no banco de dados AdventureWorks2012AdventureWorks2012 e armazenar o conjunto de resultados na tabela EmployeeSales.The first INSERT statement uses a SELECT statement to derive the data from the source tables (Employee, SalesPerson, and Person) in the AdventureWorks2012AdventureWorks2012 database and store the result set in the EmployeeSales table. A segunda instrução INSERT usa a cláusula EXECUTE para chamar um procedimento armazenado que contém a instrução SELECT, e a terceira INSERT usa a cláusula EXECUTE para referenciar a instrução SELECT como uma cadeia literal.The second INSERT statement uses the EXECUTE clause to call a stored procedure that contains the SELECT statement, and the third INSERT uses the EXECUTE clause to reference the SELECT statement as a literal string.

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;  

I.I. Usando a expressão de tabela comum WITH para definir os dados inseridosUsing WITH common table expression to define the data inserted

O exemplo a seguir cria a tabela NewEmployee no banco de dados AdventureWorks2012AdventureWorks2012.The following example creates the NewEmployee table in the AdventureWorks2012AdventureWorks2012 database. Uma expressão de tabela comum (EmployeeTemp) define as linhas de uma ou mais tabelas a serem inseridas na tabela NewEmployee.A common table expression (EmployeeTemp) defines the rows from one or more tables to be inserted into the NewEmployee table. A instrução INSERT faz referência às colunas na expressão de tabela comum.The INSERT statement references the columns in the common table expression.

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  

J.J. Usando TOP para limitar os dados inseridos na tabela de origemUsing TOP to limit the data inserted from the source table

O exemplo a seguir cria a tabela EmployeeSales e insere o nome e os dados de vendas acumuladas no ano dos cinco funcionários principais aleatórios da tabela HumanResources.Employee no banco de dados AdventureWorks2012AdventureWorks2012.The following example creates the table EmployeeSales and inserts the name and year-to-date sales data for the top 5 random employees from the table HumanResources.Employee in the AdventureWorks2012AdventureWorks2012 database. A instrução INSERT escolhe quaisquer cinco linhas retornadas pela instrução SELECT.The INSERT statement chooses any 5 rows returned by the SELECT statement. A cláusula OUTPUT exibe as linhas inseridas na tabela EmployeeSales.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Observe que a cláusula ORDER BY na instrução SELECT não é usada para determinar os cinco funcionários principais.Notice that the ORDER BY clause in the SELECT statement is not used to determine the top 5 employees.

CREATE TABLE dbo.EmployeeSales  
( EmployeeID   nvarchar(11) NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  YearlySales  money NOT NULL  
 );  
GO  
INSERT TOP(5)INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

Se você precisar usar TOP para inserir linhas em uma ordem cronológica significativa, deverá usar TOP com ORDER BY em uma instrução de subseleção, conforme mostrado no exemplo a seguir.If you have to use TOP to insert rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement as shown in the following example. A cláusula OUTPUT exibe as linhas inseridas na tabela EmployeeSales.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Observe que os cinco funcionários principais agora são inseridos com base nos resultados da cláusula ORDER BY em vez de linhas aleatórias.Notice that the top 5 employees are now inserted based on the results of the ORDER BY clause instead of random rows.

INSERT INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

Especificando objetos de destino diferentes de tabelas padrãoSpecifying Target Objects Other Than Standard Tables

Os exemplos desta seção demonstram como inserir linhas com a especificação de uma exibição ou variável de tabela.Examples in this section demonstrate how to insert rows by specifying a view or table variable.

K.K. Inserindo dados especificando uma exibiçãoInserting data by specifying a view

O exemplo a seguir especifica um nome de exibição como objeto de destino. No entanto, a nova linha é inserida na tabela básica subjacente.The following example specifies a view name as the target object; however, the new row is inserted in the underlying base table. A ordem dos valores na instrução INSERT deve corresponder à ordem das colunas da exibição.The order of the values in the INSERT statement must match the column order of the view. Para obter mais informações, confira Modificar dados por meio de uma exibição.For more information, see Modify Data Through a View.

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  

L.L. Inserindo dados em uma variável de tabelaInserting data into a table variable

O exemplo a seguir especifica uma variável de tabela como o objeto de destino no banco de dados AdventureWorks2012AdventureWorks2012.The following example specifies a table variable as the target object in the AdventureWorks2012AdventureWorks2012 database.

-- 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  

Inserindo linhas em uma tabela remotaInserting Rows into a Remote Table

Os exemplos desta seção demonstram como inserir linhas em uma tabela de destino remoto usando um servidor vinculado ou uma função de conjunto de linhas para referenciar a tabela remota.Examples in this section demonstrate how to insert rows into a remote target table by using a linked server or a rowset function to reference the remote table.

M.M. Inserindo dados em uma tabela remota usando um servidor vinculadoInserting data into a remote table by using a linked server

O exemplo a seguir insere linhas em uma tabela remota.The following example inserts rows into a remote table. O exemplo começa criando um link com a fonte de dados remota usando sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. O nome do servidor vinculado, MyLinkServer, é especificado, em seguida, como parte do nome de objeto de quatro partes no formulário server.catalog.schema.object.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' 
-- or 'server_nameinstance_name'.  
  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
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.AdventureWorks2012.HumanResources.Department (Name, GroupName)  
VALUES (N'Public Relations', N'Executive General and Administration');  
GO  

N.N. Inserindo dados em uma tabela remota usando a função OPENQUERYInserting data into a remote table by using the OPENQUERY function

O exemplo a seguir insere uma linha em uma tabela remota especificando a função do conjunto de linhas OPENQUERY.The following example inserts a row into a remote table by specifying the OPENQUERY rowset function. O nome de servidor vinculado criado no exemplo anterior é usado neste exemplo.The linked server name created in the previous example is used in this example.

Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

INSERT OPENQUERY (MyLinkServer, 
    'SELECT Name, GroupName 
     FROM AdventureWorks2012.HumanResources.Department')  
VALUES ('Environmental Impact', 'Engineering');  
GO  

O.O. Inserindo dados em uma tabela remota usando a função OPENDATASOURCEInserting data into a remote table by using the OPENDATASOURCE function

O exemplo a seguir insere uma linha em uma tabela remota especificando a função do conjunto de linhas OPENDATASOURCE.The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. Especifique um nome do servidor válido para a fonte de dados usando o formato server_name ou server_name\instance_name.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

-- 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_nameinstance_name.  
  
INSERT INTO OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

P.P. Fazendo uma inserção em uma tabela externa criada com o PolyBaseInserting into an external table created using PolyBase

Exporte dados do SQL Server para o Hadoop ou armazenamento do Azure.Export data from SQL Server to Hadoop or Azure Storage. Primeiro, crie uma tabela externa que aponta para o diretório ou arquivo de destino.First, create an external table that points to the destination file or directory. Em seguida, use INSERT INTO para exportar dados de uma tabela do SQL Server local para uma fonte de dados externa.Then, use INSERT INTO to export data from a local SQL Server table to an external data source. A instrução INSERT INTO cria o arquivo ou o diretório de destino se eles não existirem, e os resultados da instrução SELECT são exportados para o local especificado no formato de arquivo especificado.The INSERT INTO statement creates the destination file or directory if it does not exist and the results of the SELECT statement are exported to the specified location in the specified file format. Para obter mais informações, consulte Introdução ao PolyBase.For more information, see Get started with PolyBase.

Aplica-se a: SQL ServerSQL Server.Applies to: SQL ServerSQL Server.

-- Create an external table.   
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (  
        [FirstName] char(25) NOT NULL,   
        [LastName] char(25) NOT NULL,   
        [YearlyIncome] float NULL,   
        [MaritalStatus] char(1) NOT NULL  
)  
WITH (  
        LOCATION='/old_data/2009/customerdata.tbl',  
        DATA_SOURCE = HadoopHDP2,  
        FILE_FORMAT = TextFileFormat,  
        REJECT_TYPE = VALUE,  
        REJECT_VALUE = 0  
);  
  
-- Export data: Move old data to Hadoop while keeping 
-- it query-able via external table.  

INSERT INTO dbo.FastCustomer2009  
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2  
ON (T1.CustomerKey = T2.CustomerKey)  
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;  

Carregamento de dados em massa por meio de tabelas ou arquivos de dadosBulk Loading Data from Tables or Data Files

Os exemplos nesta seção demonstram dois métodos para carregar dados em massa em uma tabela usando a instrução INSERT.Examples in this section demonstrate two methods to bulk load data into a table by using the INSERT statement.

Q.Q. Inserindo dados em um heap com registro em log mínimoInserting data into a heap with minimal logging

O exemplo a seguir cria uma nova tabela (um heap) e insere dados de outra tabela nela usando o registro em log mínimo.The following example creates a new table (a heap) and inserts data from another table into it using minimal logging. O exemplo pressupõe que o modelo de recuperação do banco de dados AdventureWorks2012 esteja definido como FULL.The example assumes that the recovery model of the AdventureWorks2012 database is set to FULL. Para assegurar um registro em log mínimo, o modelo de recuperação do banco de dados AdventureWorks2012 é definido como BULK_LOGGED antes da inserção das linhas e redefinido como FULL após a instrução INSERT INTO...SELECT.To ensure minimal logging is used, the recovery model of the AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the INSERT INTO...SELECT statement. Além disso, a dica TABLOCK é especificada para o tabela de destino Sales.SalesHistory.In addition, the TABLOCK hint is specified for the target table Sales.SalesHistory. Isso garante que a instrução use espaço mínimo no log de transação e seja executada de forma eficaz.This ensures that the statement uses minimal space in the transaction log and performs efficiently.

-- 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 AdventureWorks2012  
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 AdventureWorks2012  
SET RECOVERY FULL;  
GO  

R.R. Usando uma função OPENROWSET com BULK para carregar dados em massa em uma tabelaUsing the OPENROWSET function with BULK to bulk load data into a table

O exemplo a seguir insere linhas de um arquivo de dados em uma tabela especificando a função OPENROWSET.The following example inserts rows from a data file into a table by specifying the OPENROWSET function. A dica de tabela IGNORE_TRIGGERS é especificada para otimização de desempenho.The IGNORE_TRIGGERS table hint is specified for performance optimization. Para obter mais exemplos, consulte Importar dados em massa usando BULK INSERT ou OPENROWSET(BULK...) (SQL Server).For more examples, see Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)  
SELECT b.Name, b.GroupName   
FROM OPENROWSET (  
    BULK 'C:SQLFilesDepartmentData.txt',  
    FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',  
    ROWS_PER_BATCH = 15000)AS b ;  

Substituindo o comportamento padrão do otimizador de consulta usando dicasOverriding the Default Behavior of the Query Optimizer by Using Hints

Os exemplos desta seção demonstram como usar dicas de tabela para substituir temporariamente o comportamento padrão do otimizador de consulta durante o processamento da instrução INSERT.Examples in this section demonstrate how to use table hints to temporarily override the default behavior of the query optimizer when processing the INSERT statement.

Cuidado

Como o otimizador de consulta do SQL ServerSQL Server normalmente seleciona o melhor plano de execução para uma consulta, é recomendável que desenvolvedores e administradores de banco de dados experientes usem as dicas apenas como um último recurso.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

S.S. Usando a dica TABLOCK para especificar um método de bloqueioUsing the TABLOCK hint to specify a locking method

O exemplo a seguir especifica que um bloqueio exclusivo (X) é executado na tabela Production.Location e é mantido até o fim da instrução INSERT.The following example specifies that an exclusive (X) lock is taken on the Production.Location table and is held until the end of the INSERT statement.

Aplica-se a: SQL ServerSQL Server, Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server, Banco de Dados SQLSQL Database.

INSERT INTO Production.Location WITH (XLOCK)  
(Name, CostRate, Availability)  
VALUES ( N'Final Inventory', 15.00, 80.00);  

Capturando os resultados da instrução INSERTCapturing the Results of the INSERT Statement

Os exemplos desta seção demonstram como usar a Cláusula OUTPUT para retornar informações ou expressões baseadas em cada linha afetada por uma instrução INSERT.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an INSERT statement. Esses resultados podem ser retornados ao aplicativo de processamento para uso em mensagens de confirmação, arquivamentos e outros requisitos similares de aplicativo.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

T.T. Usando OUTPUT com uma instrução INSERTUsing OUTPUT with an INSERT statement

O exemplo a seguir insere uma linha na tabela ScrapReason e usa a cláusula OUTPUT para retornar os resultados da instrução para a variável de tabela @MyTableVar.The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVar table variable. Como a coluna ScrapReasonID está definida com uma propriedade IDENTITY, não é especificado um valor na instrução INSERT para essa coluna.Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. No entanto, observe que o valor gerado pelo Mecanismo de Banco de DadosDatabase Engine para a coluna é retornado na cláusula OUTPUT na coluna INSERTED.ScrapReasonID.However, note that the value generated by the Mecanismo de Banco de DadosDatabase Engine for that column is returned in the OUTPUT clause in the INSERTED.ScrapReasonID column.

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;  

U.U. Usando OUTPUT com colunas de identidade e colunas computadasUsing OUTPUT with identity and computed columns

O exemplo a seguir cria a tabela EmployeeSales e, em seguida, insere várias linhas nela por meio de uma instrução INSERT com uma instrução SELECT para recuperar dados das tabelas de origem.The following example creates the EmployeeSales table and then inserts several rows into it using an INSERT statement with a SELECT statement to retrieve data from source tables. A tabela EmployeeSales contém uma coluna de identidade (EmployeeID) e uma coluna computada (ProjectedSales).The EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales). Como esses valores são gerados pelo Mecanismo de Banco de DadosDatabase Engine durante a operação de inserção, nenhuma dessas colunas pode ser definida em @MyTableVar.Because these values are generated by the Mecanismo de Banco de DadosDatabase Engine during the insert operation, neither of these columns can be defined in @MyTableVar.

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;  

V.V. Inserindo dados retornados de uma cláusula OUTPUTInserting data returned from an OUTPUT clause

O exemplo a seguir captura dados retornados pela cláusula OUTPUT de uma instrução MERGE e insere esses dados em outra tabela.The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. A instrução MERGE atualiza diariamente a coluna Quantity da tabela ProductInventory, com base em pedidos processados na tabela SalesOrderDetail do banco de dados AdventureWorks2012AdventureWorks2012.The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. Ela também exclui linhas de produtos cujos inventários chegaram a 0.It also deletes rows for products whose inventories drop to 0. O exemplo captura as linhas excluídas e as insere em outra tabela, ZeroInventory, que rastreia produtos sem-estoque.The example captures the rows that are deleted and inserts them into another table, ZeroInventory, which tracks products with no inventory.

--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;  

W.W. Inserindo dados usando a opção SELECTInserting data using the SELECT option

O exemplo a seguir mostra como inserir várias linhas de dados usando uma instrução INSERT com uma opção SELECT.The following example shows how to insert multiple rows of data using an INSERT statement with a SELECT option. A primeira instrução INSERT usa uma instrução SELECT diretamente para recuperar dados das tabelas de origem e, em seguida, armazenar o conjunto de resultados na tabela EmployeeTitles.The first INSERT statement uses a SELECT statement directly to retrieve data from the source table, and then to store the result set in the EmployeeTitles table.

CREATE TABLE EmployeeTitles  
( EmployeeKey   INT NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  Title      varchar(50) NOT NULL  
);  
INSERT INTO EmployeeTitles  
    SELECT EmployeeKey, LastName, Title   
    FROM ssawPDW.dbo.DimEmployee  
    WHERE EndDate IS NULL;  

X.X. Especificando um rótulo com a instrução INSERTSpecifying a label with the INSERT statement

O exemplo a seguir mostra o uso de um rótulo com uma instrução INSERT.The following example shows the use of a label with an INSERT statement.

-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  

Y.Y. Usando um rótulo e uma dica de consulta com a instrução INSERTUsing a label and a query hint with the INSERT statement

Esta consulta mostra a sintaxe básica de uso de um rótulo e uma dica de junção de consulta com a instrução INSERT.This query shows the basic syntax for using a label and a query join hint with the INSERT statement. Depois que a consulta é enviada para o nó de Controle, o SQL ServerSQL Server, em execução nos nós de Computação, aplicará a estratégia de junção hash ao gerar o plano de consulta do SQL ServerSQL Server.After the query is submitted to the Control node, SQL ServerSQL Server, running on the Compute nodes, will apply the hash join strategy when it generates the SQL ServerSQL Server query plan. Para obter mais informações sobre dicas de junção e como usar a cláusula OPTION, consulte OPTION (SQL Server PDW).For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  
  
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey, 
    FirstName, MiddleName, LastName )   
SELECT ProspectiveBuyerKey, ProspectAlternateKey, 
    FirstName, MiddleName, LastName  
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode  
WHERE g.CountryRegionCode = 'FR'  
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);  

Consulte TambémSee Also

BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
IDENTITY (Propriedade) (Transact-SQL) IDENTITY (Property) (Transact-SQL)
NEWID (Transact-SQL) NEWID (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
MERGE (Transact-SQL) MERGE (Transact-SQL)
Cláusula OUTPUT (Transact-SQL) OUTPUT Clause (Transact-SQL)
Usar as tabelas inseridas e excluídasUse the inserted and deleted Tables