Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Armazém no Microsoft Fabric
Base de dados SQL no Microsoft Fabric
Adiciona uma ou mais linhas a uma tabela ou modo de exibição no SQL Server. Para obter exemplos, consulte Exemplos.
Transact-SQL convenções de sintaxe
Syntax
Sintaxe do SQL Server e do Banco de Dados SQL do Azure e do Banco de Dados SQL da Malha
-- Syntax for SQL Server and Azure SQL Database and Fabric 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 ]
Sintaxe para o Azure Synapse Analytics e Parallel Data Warehouse e Microsoft Fabric Warehouse
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
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 ] ) ]
[;]
Arguments
COM common_table_expression <>
Especifica o conjunto de resultados nomeados temporários, também conhecido como expressão de tabela comum, definido dentro do escopo da instrução INSERT. O conjunto de resultados é derivado de uma instrução SELECT. Para obter mais informações, consulte WITH common_table_expression (Transact-SQL).
TOPO (expressão) [ PERCENTAGEM ]
Especifica o número ou a porcentagem de linhas aleatórias que serão inseridas.
A expressão pode ser um número ou uma porcentagem das linhas. Para obter mais informações, consulte TOP (Transact-SQL).
INTO
É uma palavra-chave opcional que pode ser usada entre INSERT e a tabela de destino.
server_name
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
É o nome do servidor vinculado no qual a tabela ou exibição está localizada. server_name pode ser especificado como um nome de servidor vinculado ou usando a função OPENDATASOURCE .
Quando server_name é especificado como um servidor vinculado, database_name e schema_name são necessários. Quando server_name é especificado com OPENDATASOURCE, database_name e schema_name podem não se aplicar a todas as fontes de dados e estão sujeitas aos recursos do provedor OLE DB que acessa o objeto remoto.
database_name
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
É o nome do banco de dados.
schema_name
É o nome do esquema ao qual a tabela ou exibição pertence.
table_or view_name
É o nome da tabela ou exibição que deve receber os dados.
Uma variável de tabela , dentro de seu escopo, pode ser usada como uma fonte de tabela em uma instrução INSERT.
O modo de exibição referenciado por table_or_view_name deve ser atualizável e fazer referência exatamente a uma tabela base na cláusula FROM do modo de exibição. Por exemplo, um INSERT em um modo de exibição de várias tabelas deve usar um column_list que faça referência apenas a colunas de uma tabela base. Para obter mais informações sobre modos de exibição atualizáveis, consulte CREATE VIEW (Transact-SQL).
rowset_function_limited
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
É a função OPENQUERY ou OPENROWSET . O uso dessas funções está sujeito aos recursos do provedor OLE DB que acessa o objeto remoto.
COM ( <table_hint_limited> [... n ] )
Especifica uma ou mais dicas de tabela permitidas para uma tabela de destino. A palavra-chave WITH e os parênteses são obrigatórios.
READPAST, NOLOCK e READUNCOMMITTED não são permitidos. Para obter mais informações sobre dicas de tabela, consulte Dicas de tabela (Transact-SQL).
Important
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 Server. Essas dicas não afetam o desempenho das instruções INSERT. Evite usá-los em novos trabalhos de desenvolvimento e planeje modificar aplicativos que os usam atualmente.
Especificar a dica TABLOCK em uma tabela que é o destino de uma instrução INSERT tem o mesmo efeito que especificar a dica TABLOCKX. Um cadeado exclusivo é levado sobre a mesa.
(column_list)
É uma lista de uma ou mais colunas nas quais inserir dados.
column_list devem ser colocados entre parênteses e delimitados por vírgulas.
Se uma coluna não estiver em column_list, o Mecanismo de Banco de Dados deverá ser capaz de fornecer um valor com base na definição da coluna; caso contrário, a linha não poderá ser carregada. O Mecanismo de Banco de Dados fornece automaticamente um valor para a coluna se a coluna:
Tem uma propriedade IDENTITY. O próximo valor de identidade incremental é usado.
Tem um padrão. O valor padrão para a coluna é usado.
Tem um tipo de dados de carimbo de data/hora . O valor atual do carimbo de data/hora é usado.
É anulável. Um valor nulo é usado.
É uma coluna calculada. O valor calculado é usado.
column_list deve ser usado quando valores explícitos são inseridos em uma coluna de identidade e a opção SET IDENTITY_INSERT deve estar ON para a tabela.
Cláusula OUTPUT
Retorna linhas inseridas como parte da operação de inserção. Os resultados podem ser devolvidos ao pedido de processamento ou inseridos numa tabela ou variável de tabela para processamento posterior.
A cláusula OUTPUT não é suportada em instruções DML que fazem referência a exibições particionadas locais, exibições particionadas distribuídas ou tabelas remotas ou instruções INSERT que contêm um execute_statement. A cláusula OUTPUT INTO não é suportada em instruções INSERT que contêm uma <cláusula dml_table_source> . Para obter mais informações sobre os argumentos e o comportamento dessa cláusula, consulte Cláusula OUTPUT (Transact-SQL).
VALUES
Apresenta a lista ou listas de valores de dados a serem inseridos. Deve haver um valor de dados para cada coluna no column_list, se especificado, ou na tabela. A lista de valores deve ser colocada entre parênteses.
Se os valores na lista Valor não estiverem na mesma ordem que as colunas na tabela ou não tiverem um valor para cada coluna na tabela, column_list deverá ser usado para especificar explicitamente a coluna que armazena cada valor de entrada.
Você pode usar o construtor Transact-SQL row (também chamado de construtor de valor de tabela) para especificar várias linhas em uma única instrução INSERT. O construtor de linha consiste em uma única cláusula VALUES com várias listas de valores entre parênteses e separadas por uma vírgula. Para obter mais informações, consulte Table Value Constructor (Transact-SQL).
Note
O construtor de valor de tabela não é suportado no Azure Synapse Analytics. Em vez disso, as instruções subsequentes INSERT podem ser executadas para inserir várias linhas. No Azure Synapse Analytics, os valores de inserção só podem ser valores literais constantes ou referências de variáveis. Para inserir um valor não literal, defina uma variável como valor não constante e insira a variável.
DEFAULT
Força o Mecanismo de Banco de Dados a carregar o valor padrão definido para uma coluna. Se não existir um padrão para a coluna e a coluna permitir valores nulos, NULL será inserido. Para uma coluna definida com o tipo de dados de carimbo de data/hora , o próximo valor de carimbo de data/hora é inserido. DEFAULT não é válido para uma coluna de identidade.
expression
É uma constante, uma variável ou uma expressão. A expressão não pode conter uma instrução EXECUTE.
Ao fazer referência aos tipos de dados de caracteres Unicode nchar, nvarchar e ntext, 'expressão' deve ser prefixada com a letra maiúscula 'N'. Se 'N' não for especificado, o SQL Server converte a cadeia de caracteres na página de código que corresponde ao agrupamento padrão do banco de dados ou coluna. Todos os caracteres não encontrados nesta página de código são perdidos.
derived_table
É qualquer instrução SELECT válida que retorna linhas de dados a serem carregadas na tabela. A instrução SELECT não pode conter uma expressão de tabela comum (CTE).
execute_statement
É qualquer instrução EXECUTE válida que retorna dados com instruções SELECT ou READTEXT. Para obter mais informações, consulte EXECUTE (Transact-SQL).
As opções RESULT SETS da instrução EXECUTE não podem ser especificadas em um INSERT... Declaração EXEC.
Se execute_statement for usado com INSERT, cada conjunto de resultados deve ser compatível com as colunas na tabela ou no column_list.
execute_statement pode ser usado para executar procedimentos armazenados no mesmo servidor ou em um servidor remoto. O procedimento no servidor remoto é executado e os conjuntos de resultados são retornados ao servidor local e carregados na tabela no servidor local. 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 conjuntos de resultados ativos (MARS) habilitados.
Se execute_statement retorna dados com a instrução READTEXT, cada instrução READTEXT pode retornar um máximo de 1 MB (1024 KB) de dados. execute_statement também pode ser usado com procedimentos estendidos. execute_statement insere os dados retornados pelo thread principal do procedimento estendido; no entanto, a saída de threads diferentes do thread principal não são inseridos.
Não é possível especificar um parâmetro com valor de tabela como o destino de uma instrução INSERT EXEC; no entanto, ele pode ser especificado como uma fonte na cadeia de caracteres INSERT EXEC ou stored-procedure. Para obter mais informações, consulte Usar parâmetros de Table-Valued (Mecanismo de Banco de Dados).
<dml_table_source>
Especifica que as linhas inseridas na tabela de destino são aquelas retornadas pela cláusula OUTPUT de uma instrução INSERT, UPDATE, DELETE ou MERGE, opcionalmente filtrada por uma cláusula WHERE. Se <dml_table_source> for especificado, o destino da instrução INSERT externa deve atender às seguintes restrições:
Deve ser uma tabela de base, não uma vista.
Não pode ser uma mesa remota.
Ele não pode ter nenhum gatilho definido nele.
Ele não pode participar de nenhuma relação chave-chave estrangeira primária.
Ele não pode participar da replicação de mesclagem ou de assinaturas atualizáveis para replicação transacional.
O nível de compatibilidade do banco de dados deve ser definido como 100 ou superior. Para obter mais informações, consulte Cláusula OUTPUT (Transact-SQL).
<select_list>
É uma lista separada por vírgulas que especifica quais colunas retornadas pela cláusula OUTPUT devem ser inseridas. As colunas em <select_list> devem ser compatíveis com as colunas nas quais os valores estão sendo inseridos.
<
> select_list não pode fazer referência a funções agregadas ou TEXTPTR.
Note
Todas as variáveis listadas na lista SELECT referem-se aos seus valores originais, independentemente de quaisquer alterações feitas a elas no <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. A instrução não pode conter uma cláusula WITH e não pode ter como alvo tabelas remotas ou exibições particionadas. Se UPDATE ou DELETE for especificado, não poderá ser um UPDATE ou DELETE baseado em cursor. As linhas de origem não podem ser referenciadas como instruções DML aninhadas.
ONDE search_condition <>
É qualquer cláusula WHERE que contenha um search_condition< válido >que filtre as linhas retornadas por <dml_statement_with_output_clause>. Para obter mais informações, consulte Condição de pesquisa (Transact-SQL). Quando usado neste contexto, <search_condition> não pode conter subconsultas, funções escalares definidas pelo usuário que executam acesso a dados, funções agregadas, TEXTPTR ou predicados de pesquisa de texto completo.
VALORES PADRÃO
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Força a nova linha a conter os valores padrão definidos para cada coluna.
BULK
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Usado por ferramentas externas para carregar um fluxo de dados binário. Essa opção não se destina ao uso com ferramentas como SQL Server Management Studio, SQLCMD, OSQL, ou interfaces de programação de aplicativos de acesso a dados, como o SQL Server Native Client.
FIRE_TRIGGERS
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Especifica que todos os gatilhos de inserção definidos na tabela de destino são executados durante a operação de carregamento do fluxo de dados binários. Para obter mais informações, consulte BULK INSERT (Transact-SQL).
CHECK_CONSTRAINTS
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Especifica que todas as restrições na tabela ou exibição de destino devem ser verificadas durante a operação de carregamento do fluxo de dados binários. Para obter mais informações, consulte BULK INSERT (Transact-SQL).
KEEPNULLS
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Especifica que as colunas vazias devem reter um valor nulo durante a operação de carregamento do fluxo de dados binários. Para obter mais informações, consulte manter nulos ou usar valores padrão durante a importação em massa (SQL Server).
KILOBYTES_PER_BATCH = kilobytes_per_batch
Especifica o número aproximado de kilobytes (KB) de dados por lote como kilobytes_per_batch. Para obter mais informações, consulte BULK INSERT (Transact-SQL).
ROWS_PER_BATCH =rows_per_batch
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Indica o número aproximado de linhas de dados no fluxo de dados binários. Para obter mais informações, consulte BULK INSERT (Transact-SQL).
Note
Um erro de sintaxe é gerado se uma lista de colunas não for fornecida.
Remarks
Para obter informações específicas para inserir dados em tabelas do SQL Graph, consulte INSERT (SQL Graph).
A dica de consulta MAXDOP não é suportada durante as operações INSERT SELECT quando a parte SELECT da instrução é lida de fontes externas.
Melhores práticas
Use a função @@ROWCOUNT para retornar o número de linhas inseridas para o aplicativo cliente. Para obter mais informações, consulte @@ROWCOUNT (Transact-SQL).
Práticas recomendadas para importação de dados em massa
Usando INSERT INTO... SELECT para importar dados em massa com o mínimo de registro em log e paralelismo
Você pode usar 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 registro mínimo. O registro mínimo pode melhorar o desempenho da instrução e reduzir a possibilidade de a operação preencher o espaço disponível no log de transações durante a transação.
O registro mínimo para esta instrução tem os seguintes requisitos:
- O modelo de recuperação do banco de dados é definido como simples ou registrado em massa.
- A tabela de destino é um heap vazio ou não vazio.
- A tabela de destino não é usada na replicação.
- A
TABLOCKdica é especificada para a tabela de destino.
As linhas que são inseridas em uma pilha como resultado de uma ação de inserção em uma instrução MERGE também podem ser minimamente registradas.
Ao contrário da BULK INSERT instrução, que mantém um bloqueio de atualização em massa (BU) menos restritivo, INSERT INTO … SELECT com a dica TABLOCK mantém um bloqueio exclusivo (X) na mesa. Isso significa que você não pode inserir linhas usando várias operações de inserção executadas simultaneamente.
No entanto, a partir do SQL Server 2016 (13.x) e do nível de compatibilidade de banco de dados 130, uma única INSERT INTO … SELECT instrução pode ser executada em paralelo ao inserir em heaps ou índices columnstore clusterizados (CCI). Inserções paralelas são possíveis ao usar a TABLOCK dica.
O paralelismo para a instrução acima tem os seguintes requisitos, que são semelhantes aos requisitos para registro mínimo:
- A tabela de destino é um heap vazio ou não vazio.
- A tabela de destino tem um índice columnstore clusterizado (CCI), mas não índices não clusterizados.
- A tabela de destino não tem uma coluna de identidade com IDENTITY_INSERT definida como OFF.
- A
TABLOCKdica é especificada para a tabela de destino.
Para cenários em que os requisitos de registro mínimo e inserção paralela são atendidos, ambas as melhorias funcionarão juntas para garantir a taxa de transferência máxima de suas operações de carga de dados.
Para obter mais informações sobre como usar INSERT em seu Warehouse no Microsoft Fabric, consulte Ingerir dados em seu Warehouse usando Transact-SQL.
Note
Inserções em tabelas temporárias locais (identificadas pelo prefixo #) e tabelas temporárias globais (identificadas por prefixos ##) também são habilitadas para paralelismo usando a dica TABLOCK.
Usando OPENROWSET e BULK para importar dados em massa
A função OPENROWSET pode aceitar as seguintes dicas de tabela, que fornecem otimizações de carga em massa com a instrução INSERT:
- A
TABLOCKdica pode minimizar o número de registros de log para a operação de inserção. 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. Para obter mais informações, consulte Pré-requisitos para registro mínimo em log na importação em massa. - A
TABLOCKdica pode habilitar operações de inserção paralela. A tabela de destino é um índice de armazenamento de colunas (CCI) de heap ou clusterizado sem índices não clusterizados e a tabela de destino não pode ter uma coluna de identidade especificada. - A
IGNORE_CONSTRAINTSdica pode desativar temporariamente a verificação de restrições FOREIGN KEY e CHECK. - A
IGNORE_TRIGGERSdica pode desativar temporariamente a execução do gatilho. - A
KEEPDEFAULTSdica permite a inserção do valor padrão de uma coluna de tabela, se houver, em vez de NULL quando o registro de dados não tem um valor para a coluna. - A
KEEPIDENTITYdica permite que os valores de identidade no arquivo de dados importado sejam usados para a coluna de identidade na tabela de destino.
Essas otimizações são semelhantes às disponíveis com o BULK INSERT comando. Para obter mais informações, consulte Sugestões para tabelas (Transact-SQL).
Tipos de dados
Ao inserir linhas, considere o seguinte comportamento de tipo de dados:
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 SET ANSI_PADDING definida para a coluna quando a tabela foi criada. Para obter mais informações, consulte SET ANSI_PADDING (Transact-SQL).
A tabela a seguir mostra a operação padrão para SET ANSI_PADDING OFF.
Tipo de dados Operação padrão char Valor do pad com espaços para a largura definida da coluna. varchar Remova os espaços à direita para o último caractere sem espaço ou para um caractere de espaço único para cadeias de caracteres compostas apenas por espaços. varbinary Remova os zeros à direita. Se uma cadeia de caracteres vazia (' ') for carregada em uma coluna com um tipo de dados varchar ou texto , a operação padrão será carregar uma cadeia de caracteres de comprimento zero.
A inserção de um valor nulo em uma coluna de texto ou imagem não cria um ponteiro de texto válido, nem pré-aloca uma página de texto de 8 KB.
As colunas criadas com o tipo de dados uniqueidentifier armazenam valores binários de 16 bytes especialmente formatados. Ao contrário das colunas de identidade, o Mecanismo de Banco de Dados não gera automaticamente valores para colunas com o tipo de dados uniqueidentifier . Durante uma operação de inserção, variáveis com um tipo de dados de identificador único e constantes de cadeia de caracteres no formato xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxxxx (36 caracteres, incluindo hífenes, onde x é um dígito hexadecimal no intervalo 0-9 ou a-f) podem ser usadas para colunas uniqueidentifier . Por exemplo, 6F9619FF-8B86-D011-B42D-00C04FC964FF é um valor válido para uma variável ou coluna uniqueidentifier . Use a função NEWID() para obter um ID globalmente exclusivo (GUID).
Inserindo valores em colunas de tipo User-Defined
Você pode inserir valores em colunas de tipo definidas pelo usuário:
Fornecendo um valor do tipo definido pelo usuário.
Fornecer um valor em um tipo de dados de sistema do SQL Server, desde que o tipo definido pelo usuário ofereça suporte à conversão implícita ou explícita desse tipo. O exemplo a seguir mostra como inserir um valor em uma coluna do tipo
Pointdefinido pelo usuário , convertendo explicitamente de uma cadeia de caracteres.INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );Um valor binário também pode ser fornecido sem executar a conversão explícita, porque todos os tipos definidos pelo usuário são implicitamente conversíveis de binário.
Chamando uma função definida pelo usuário que retorna um valor do tipo definido pelo usuário. O exemplo a seguir usa uma função
CreateNewPoint()definida pelo usuário para criar um novo valor do tipoPointdefinido pelo usuário e inserir o valor naCitiestabela.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Tratamento de erros
Você pode implementar o tratamento de erros para a instrução INSERT especificando a instrução em um TRY... Construção CATCH.
Se uma instrução INSERT violar uma restrição ou regra, ou se tiver um valor incompatível com o tipo de dados da coluna, a instrução falhará e uma mensagem de erro será retornada.
Se INSERT estiver carregando várias linhas com SELECT ou EXECUTE, qualquer violação de uma regra ou restrição que ocorra a partir dos valores que estão sendo carregados fará com que a instrução seja interrompida e nenhuma linha seja carregada.
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 Dados manipula esses erros como se SET ARITHABORT estivesse definido como ON. O lote é interrompido e uma mensagem de erro é retornada. Durante a avaliação de expressão quando SET ARITHABORT e SET ANSI_WARNINGS estão OFF, se uma instrução INSERT, DELETE ou UPDATE encontrar um erro aritmético, estouro, divisão por zero ou um erro de domínio, o SQL Server insere ou atualiza um valor NULL. 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á um erro.
Interoperability
Quando um INSTEAD OF gatilho é definido em ações INSERT em uma tabela ou exibição, o gatilho é executado em vez da instrução INSERT. Para obter mais informações sobre INSTEAD OF gatilhos, consulte CREATE TRIGGER (Transact-SQL).
Limitações e Restrições
Quando você insere valores em tabelas remotas e nem todos os valores para todas as colunas são especificados, você deve identificar as colunas nas quais os valores especificados devem ser inseridos.
Quando TOP é usado com INSERT as linhas referenciadas não são organizadas em qualquer ordem e a cláusula ORDER BY não pode ser especificada diretamente nesta instrução. Se você precisar usar TOP para inserir linhas em uma ordem cronológica significativa, deverá usar TOP juntamente com uma cláusula ORDER BY especificada em uma instrução subselect. Consulte a seção Exemplos a seguir neste tópico.
As consultas INSERT que usam SELECT com ORDER BY para preencher linhas garantem como os valores de identidade são calculados, mas não a ordem em que as linhas são inseridas.
No Parallel Data Warehouse, a cláusula ORDER BY é 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 seja especificado.
Comportamento de Registo
A instrução INSERT é sempre totalmente registrada, exceto ao usar a função OPENROWSET com a palavra-chave BULK ou ao usar INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Essas operações podem ser minimamente registradas. Para obter mais informações, consulte a seção "Práticas recomendadas para carregamento em massa de dados" anteriormente neste tópico.
Segurança
Durante uma conexão de servidor vinculado, o servidor de envio fornece um nome de login e senha para se conectar ao servidor de recebimento em seu nome. Para que essa conexão funcione, você deve criar um mapeamento de logon entre os servidores vinculados usando sp_addlinkedsrvlogin.
Quando você usa OPENROWSET(BULK...), é importante entender como o SQL Server lida com a representação. Para obter mais informações, consulte "Considerações de segurança" em Importar dados em massa usando BULK INSERT ou OPENROWSET(BULK...) (SQL Server).
Permissions
A permissão INSERT é necessária na tabela de destino.
Permissões INSERT padrão para membros da sysadmin função de servidor fixa, as db_owner funções de banco de dados fixa db_datawriter e o proprietário da tabela. Os membros do sysadmin, db_ownere as db_securityadmin funções, e o proprietário da tabela podem transferir permissões para outros usuários.
Para executar INSERT com a opção BULK da função OPENROWSET, você deve ser membro da sysadmin função de servidor fixa ou da função de bulkadmin servidor fixa.
Examples
| Category | Elementos de sintaxe em destaque |
|---|---|
| Sintaxe básica | INSERT * construtor de valor de tabela |
| Manipulando valores de coluna | IDENTITY * NEWID * valores padrão * tipos definidos pelo usuário |
| Inserindo dados de outras tabelas | INSERIR... SELECIONAR * INSERIR... EXECUTAR * COM expressão de tabela comum * TOPO * DESLOCAMENTO FETCH |
| Especificando objetos de destino diferentes de tabelas padrão | Visualizações * variáveis de tabela |
| Inserindo linhas em uma tabela remota | Servidor vinculado * Função de conjunto de linhas OPENQUERY * Função de conjunto de linhas OPENDATASOURCE |
| Carregamento em massa de dados de tabelas ou arquivos de dados | INSERIR... Função SELECT * OPENROWSET |
| Substituindo o comportamento padrão do otimizador de consulta usando dicas | Sugestões de tabelas |
| Capturando os resultados da instrução INSERT | Cláusula OUTPUT |
Sintaxe básica
Exemplos nesta seção demonstram a funcionalidade básica da instrução INSERT usando a sintaxe mínima necessária.
A. Inserir uma única linha de dados
O exemplo seguinte insere uma linha na Production.UnitMeasure tabela da base de dados AdventureWorks2025. As colunas nesta tabela são UnitMeasureCode, Namee ModifiedDate. Como os valores para todas as colunas são fornecidos e são listados na mesma ordem que as colunas na tabela, os nomes das colunas não precisam ser especificados na lista de colunas*.*
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
B. Inserção de várias linhas de dados
O exemplo seguinte utiliza o construtor de valor da tabela para inserir três linhas na Production.UnitMeasure tabela na base de dados AdventureWorks2025 numa única instrução INSERT. Como os valores para todas as colunas são fornecidos e são listados na mesma ordem que as colunas na tabela, os nomes das colunas não precisam ser especificados na lista de colunas.
Note
O construtor de valor de tabela não é suportado no Azure Synapse Analytics.
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
, (N'Y3', N'Cubic Yards', '20080923');
C. Inserindo dados que não estão na mesma ordem que as colunas da tabela
O exemplo a seguir usa uma lista de colunas para especificar explicitamente os valores que são inseridos em cada coluna. A ordem das colunas na Production.UnitMeasure tabela da base de dados AdventureWorks2025 é UnitMeasureCode, Name, ModifiedDate; no entanto, as colunas não estão listadas nessa ordem em column_list.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Manipulando valores de coluna
Exemplos nesta seção demonstram métodos de inserção de valores em colunas que são definidas com uma propriedade IDENTITY, um valor DEFAULT ou são definidas com tipos de dados, como uniqueidentifier ou colunas de tipo definidas pelo usuário.
D. Inserindo dados em uma tabela com colunas com valores padrão
O exemplo a seguir mostra a inserção de linhas em uma tabela com colunas que geram automaticamente um valor ou têm um valor padrão.
Column_1 é uma coluna calculada que gera automaticamente um valor concatenando uma cadeia de caracteres com o valor inserido no column_2.
Column_2 é definido com uma restrição padrão. Se um valor não for especificado para esta coluna, o valor padrão será usado.
Column_3 é definido com o tipo de dados rowversion , que gera automaticamente um número binário incremental exclusivo.
Column_4 não gera automaticamente um valor. Quando um valor para esta coluna não é especificado, NULL é inserido. As instruções INSERT inserem linhas que contêm valores para algumas das colunas, mas não para todas. Na última instrução INSERT, nenhuma coluna é especificada e apenas os valores padrão são inseridos usando a cláusula DEFAULT VALUES.
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. Inserindo dados em uma tabela com uma coluna de identidade
O exemplo a seguir mostra diferentes métodos de inserção de dados em uma coluna de identidade. As duas primeiras instruções INSERT permitem que valores de identidade sejam gerados para as novas linhas. A terceira instrução INSERT substitui a propriedade IDENTITY da coluna pela instrução SET IDENTITY_INSERT e insere um valor explícito na coluna de identidade.
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. Inserindo dados em uma coluna uniqueidentifier usando NEWID()
O exemplo a seguir usa a função NEWID() para obter um GUID para column_2. Ao contrário das colunas de identidade, o Mecanismo de Banco de Dados não gera automaticamente valores para colunas com o tipo de dados uniqueidentifier , conforme mostrado pela segunda INSERT instrução.
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. Inserindo dados em colunas de tipo definidas pelo usuário
As instruções Transact-SQL a seguir inserem três linhas na PointValue coluna da Points tabela. Esta coluna usa um tipo definido pelo usuário ( UDT) CLR. O tipo de dados Point consiste em valores inteiros X e Y que são expostos como propriedades do UDT. Você deve usar a função CAST ou CONVERT para converter os valores X e Y delimitados por vírgulas para o Point tipo. As duas primeiras instruções usam a função CONVERT para converter um valor de cadeia de caracteres para o Point tipo, e a terceira instrução usa a função CAST. Para obter mais informações, consulte Manipulando dados 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));
Inserindo dados de outras tabelas
Exemplos nesta seção demonstram métodos de inserção de linhas de uma tabela em outra tabela.
H. Usando as opções SELECT e EXECUTE para inserir dados de outras tabelas
O exemplo a seguir mostra como inserir dados de uma tabela em outra tabela usando INSERT... SELECIONAR ou INSERIR... EXECUTAR. 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.
A primeira instrução INSERT utiliza uma instrução SELECT para derivar os dados das tabelas de origem (Employee, , e Person) na base de dados AdventureWorks2025 e armazenar o conjunto de resultados na EmployeeSales tabelaSalesPerson. 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 fazer referência à instrução SELECT como uma cadeia de caracteres literal.
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. Usando a expressão de tabela comum WITH para definir os dados inseridos
O exemplo seguinte cria a NewEmployee tabela na base de dados AdventureWorks2025. Uma expressão de tabela comum (EmployeeTemp) define as linhas de uma ou mais tabelas a serem inseridas na NewEmployee tabela. A instrução INSERT faz referência às colunas na expressão de tabela comum.
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. Usando TOP para limitar os dados inseridos da tabela de origem
O exemplo seguinte cria a tabela EmployeeSales e insere o nome e os dados de vendas acumuladas no ano dos 5 principais colaboradores aleatórios a partir da tabela HumanResources.Employee na base de dados AdventureWorks2025. A instrução INSERT escolhe quaisquer 5 linhas retornadas SELECT pela instrução. A cláusula OUTPUT exibe as linhas inseridas EmployeeSales na tabela. Observe que a cláusula ORDER BY na instrução SELECT não é usada para determinar os 5 principais funcionários.
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ê tiver que usar TOP para inserir linhas em uma ordem cronológica significativa, deverá usar TOP junto com ORDER BY em uma instrução subselect, conforme mostrado no exemplo a seguir. A cláusula OUTPUT exibe as linhas inseridas EmployeeSales na tabela. Observe que os 5 melhores funcionários agora são inseridos com base nos resultados da cláusula ORDER BY, em vez de linhas aleatórias.
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ão
Os exemplos nesta seção demonstram como inserir linhas especificando uma variável de exibição ou tabela.
K. Inserindo dados especificando um modo de exibição
O exemplo a seguir especifica um nome de exibição como o objeto de destino; no entanto, a nova linha é inserida na tabela base subjacente. A ordem dos valores na instrução deve corresponder à INSERT ordem das colunas da exibição. Para obter mais informações, consulte Modificar dados por meio de um modo de exibição.
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. Inserindo dados em uma variável de tabela
O exemplo seguinte especifica uma variável de tabela como objeto alvo na base de dados AdventureWorks2025.
-- 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 remota
Os exemplos nesta 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 fazer referência à tabela remota.
M. Inserindo dados em uma tabela remota usando um servidor vinculado
O exemplo a seguir insere linhas em uma tabela remota. O exemplo começa criando um link para a fonte de dados remota usando sp_addlinkedserver. O nome do servidor vinculado, MyLinkServer, é então especificado como parte do nome do objeto de quatro partes no formato server.catalog.schema.object.
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
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'AdventureWorks2022';
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.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Public Relations', N'Executive General and Administration');
GO
N. Inserindo dados em uma tabela remota usando a função OPENQUERY
O exemplo a seguir insere uma linha em uma tabela remota especificando a função de conjunto de linhas OPENQUERY . O nome do servidor vinculado criado no exemplo anterior é usado neste exemplo.
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
INSERT OPENQUERY (MyLinkServer,
'SELECT Name, GroupName
FROM AdventureWorks2022.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
O. Inserindo dados em uma tabela remota usando a função OPENDATASOURCE
O exemplo a seguir insere uma linha em uma tabela remota especificando a função de conjunto de linhas OPENDATASOURCE . Especifique um nome de servidor válido para a fonte de dados usando o formato server_name ou server_name\instance_name.
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
-- 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')
.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Standards and Methods', 'Quality Assurance');
GO
P. Inserindo em uma tabela externa criada usando o PolyBase
Exporte dados do SQL Server para o Hadoop ou o Armazenamento do Azure. Primeiro, crie uma tabela externa que aponte para o arquivo ou diretório de destino. Em seguida, use INSERT INTO para exportar dados de uma tabela local do SQL Server para uma fonte de dados externa. A instrução INSERT INTO cria o arquivo ou diretório de destino se ele não existir e os resultados da instrução SELECT são exportados para o local especificado no formato de arquivo especificado. Para obter mais informações, consulte Introdução ao PolyBase.
Aplica-se a: SQL 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 em massa de dados de tabelas ou arquivos de dados
Exemplos nesta seção demonstram dois métodos para carregar dados em massa em uma tabela usando a instrução INSERT.
Q. Inserindo dados em uma pilha com registro mínimo
O exemplo a seguir cria uma nova tabela (um heap) e insere dados de outra tabela nela usando o log mínimo. O exemplo pressupõe que o modelo de recuperação do banco de AdventureWorks2025 dados esteja definido como FULL. Para garantir que o AdventureWorks2025 log mínimo seja usado, o modelo de recuperação do banco de dados é definido como BULK_LOGGED antes que as linhas sejam inseridas e redefinido para FULL após o INSERT INTO... Instrução SELECT. Além disso, a dica TABLOCK é especificada para a tabela Sales.SalesHistoryde destino. Isso garante que a instrução use espaço mínimo no log de transações e tenha um desempenho eficiente.
-- 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 AdventureWorks2022
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 AdventureWorks2022
SET RECOVERY FULL;
GO
R. Usando a função OPENROWSET com BULK para carregar dados em massa em uma tabela
O exemplo a seguir insere linhas de um arquivo de dados em uma tabela especificando a função OPENROWSET. A dica de tabela IGNORE_TRIGGERS é especificada para otimização de desempenho. Para obter mais exemplos, consulte Importar dados em massa usando BULK INSERT ou OPENROWSET(BULK...) (SQL Server).
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
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 dicas
Os exemplos nesta seção demonstram como usar dicas de tabela para substituir temporariamente o comportamento padrão do otimizador de consulta ao processar a instrução INSERT.
Caution
Como o otimizador de consulta do SQL Server normalmente seleciona o melhor plano de execução para uma consulta, recomendamos que as dicas sejam usadas apenas como último recurso por desenvolvedores e administradores de banco de dados experientes.
S. Usando a dica TABLOCK para especificar um método de bloqueio
O exemplo a seguir especifica que um bloqueio exclusivo (X) é obtido na tabela Production.Location e mantido até o final da instrução INSERT.
Aplica-se a: SQL Server, Banco de Dados SQL.
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
Capturando os resultados da instrução INSERT
Exemplos nesta seção demonstram como usar a cláusula OUTPUT para retornar informações de, ou expressões baseadas em, cada linha afetada por uma instrução INSERT. Esses resultados podem ser retornados ao aplicativo de processamento para uso em coisas como mensagens de confirmação, arquivamento e outros requisitos do aplicativo.
T. Usando OUTPUT com uma instrução INSERT
O exemplo a seguir insere uma linha na ScrapReason tabela e usa a OUTPUT cláusula para retornar os resultados da instrução para a @MyTableVar variável table. Como a ScrapReasonID coluna é definida com uma IDENTITY propriedade, um valor não é especificado na INSERT instrução dessa coluna. No entanto, observe que o valor gerado pelo Mecanismo de Banco de Dados para essa coluna é retornado na OUTPUT cláusula na INSERTED.ScrapReasonID coluna.
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. Usando OUTPUT com identidade e colunas computadas
O exemplo a seguir cria a EmployeeSales tabela e, em seguida, insere várias linhas nela usando uma instrução INSERT com uma instrução SELECT para recuperar dados de tabelas de origem. A EmployeeSales tabela contém uma coluna de identidade (EmployeeID) e uma coluna computada (ProjectedSales). Como esses valores são gerados pelo Mecanismo de Banco de Dados durante a operação de inserção, nenhuma dessas colunas pode ser definida em @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. Inserindo dados retornados de uma cláusula OUTPUT
O exemplo a seguir captura dados retornados da cláusula OUTPUT de uma instrução MERGE e insere esses dados em outra tabela. A instrução MERGE atualiza diariamente a Quantity coluna da ProductInventory tabela, com base nas encomendas processadas na SalesOrderDetail tabela da base de dados AdventureWorks2025. Ele também exclui linhas para produtos cujos estoques caem para 0. O exemplo captura as linhas que são excluídas e as insere em outra tabela, ZeroInventoryque rastreia produtos sem inventário.
--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. Inserindo dados usando a opção SELECT
O exemplo a seguir mostra como inserir várias linhas de dados usando uma instrução INSERT com uma opção SELECT. A primeira INSERT instrução usa uma SELECT instrução diretamente para recuperar dados da tabela de origem e, em seguida, para armazenar o conjunto de resultados na EmployeeTitles tabela.
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. Especificando um rótulo com a instrução INSERT
O exemplo a seguir mostra o uso de um rótulo com uma instrução INSERT.
-- Uses AdventureWorks
INSERT INTO DimCurrency
VALUES (500, N'C1', N'Currency1')
OPTION ( LABEL = N'label1' );
Y. Usando um rótulo e uma dica de consulta com a instrução INSERT
Esta consulta mostra a sintaxe básica para usar um rótulo e uma dica de junção de consulta com a instrução INSERT. Depois que a consulta for enviada para o nó Controle, o SQL Server, em execução nos nós Computação, aplicará a estratégia de junção de hash quando gerar o plano de consulta do SQL Server. Para obter mais informações sobre dicas de junção e como usar a cláusula OPTION, consulte 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);
Ver também
INSERÇÃO A GRANEL (Transact-SQL)
SUPRIMIR (Transact-SQL)
EXECUTAR (Transact-SQL)
DE (Transact-SQL)
IDENTIDADE (Propriedade) (Transact-SQL)
NEWID (Transact-SQL)
SELECIONAR (Transact-SQL)
ATUALIZAÇÃO (Transact-SQL)
MESCLAR (Transact-SQL)
Cláusula OUTPUT (Transact-SQL)
Utilizar as Tabelas inseridas e eliminadas