Recebi uma consulta SELECT complexa, da qual gostaria de inserir todas as linhas em uma variável de tabela, mas o T-SQL não permite.
Na mesma linha, você não pode usar uma variável de tabela com as consultas SELECT INTO ou INSERT EXEC. http://odetocode.com/Articles/365.aspx
Breve exemplo:
declare @userData TABLE(
name varchar(30) NOT NULL,
oldlocation varchar(30) NOT NULL
)
SELECT name, location
INTO @userData
FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30
Os dados na variável da tabela seriam usados posteriormente para inseri-los / atualizá-los novamente em tabelas diferentes (principalmente cópia dos mesmos dados com pequenas atualizações). O objetivo disso seria simplesmente tornar o script um pouco mais legível e mais facilmente personalizável do que fazer SELECT INTO
diretamente nas tabelas corretas. O desempenho não é um problema, pois rowcount
é pequeno e só é executado manualmente quando necessário.
... ou apenas me diga se estou fazendo tudo errado.
fonte
O objetivo de
SELECT INTO
é (de acordo com os documentos, minha ênfase)Mas você já tem uma tabela de destino! Então o que você quer é
E nessa sintaxe, é permitido
MyTable
que seja uma variável de tabela.fonte
MyTable
aqui é um espaço reservado para o nome da sua tabela real . Eu não acho que existem quaisquer bases de dados reais com uma tabela chamadaMyTable
...Você também pode usar expressões de tabela comuns para armazenar conjuntos de dados temporários. Eles são mais elegantes e amigáveis:
fonte
Você pode tentar usar tabelas temporárias ... se não estiver fazendo isso a partir de um aplicativo. (Pode ser bom executar isso manualmente)
Você pula o esforço para declarar a tabela dessa maneira ... Ajuda para consultas adhoc ... Isso cria uma tabela temporária local que não será visível para outras sessões, a menos que você esteja na mesma sessão. Talvez seja um problema se você estiver executando uma consulta em um aplicativo.
se você precisar que ele seja executado em um aplicativo, use variáveis declaradas desta maneira:
Editar: muitos de vocês mencionaram visibilidade atualizada para a sessão da conexão. Criar tabelas temporárias não é uma opção para aplicativos da Web, pois as sessões podem ser reutilizadas, atenha-se às variáveis temporárias nesses casos
fonte
function
. Na minha experiência, na maioria dos casos em que alguém pensa que precisa de tais declarações, isso realmente significa que deve repensar suafunction
- ou pelo menos refatorar para aprocedure
. Falando por mim mesmo, pelo menos. :-)Tente usar em
INSERT
vez deSELECT INTO
:fonte
Primeiro, crie uma tabela temporária:
Passo 1:
** Etapa 2: ** Insira algum valor na tabela Temp.
Etapa 3: Declarar uma variável da tabela para armazenar dados da tabela temporária.
Etapa 4: selecione o valor da tabela temporária e insira na variável da tabela.
Finalmente, o valor é inserido de uma tabela temporária na variável Table
Etapa 5: é possível verificar o valor inserido na variável da tabela.
fonte
OK, agora com bastante esforço eu sou capaz de inserir na @table usando o seguinte:
O principal aqui é selecionar colunas para inserir.
fonte
Uma razão para usar SELECT INTO é que ele permite que você use IDENTITY:
Isso não funcionaria com uma variável de tabela, o que é muito ruim ...
fonte
IDENTITY
coluna.