Olá Pessoal,
Dando continuidade ao tópico "Working with Query Fundamentals", apresento as questões de atualização de dados com instruções DML (INSERT, UPDATE e DELETE) e a cláusula OUTPUT.
Questão 055
Como uma atividade rotineira de expurgo, você possui uma tabela com 50 milhões de linhas e precisa excluir o conteúdo dessa tabela gerando o mínimo de overhead para o log de transações e bloqueios para a aplicação. Os itens abaixo devem ser levados em consideração:
- O comando deve ficar dentro de uma transação
- A tabela possui uma chave primária composta de três colunas
- A tabela não está envolvida em nenhum tipo de relacionamento
Qual seria o comando mais adequado para efetuar a exclusão dos registros ?
A. | DELETE |
B. | TRUNCATE TABLE |
C. | DROP TABLE |
D. | DBCC REINDEX(‘Tabela’) |
Questão 056
Você está desenvolvendo uma aplicação de controle de ponto e necessita em um único comando inserir vários registros referente a entrada e saída de funcionários em uma tabela específica chamada Marcacoes.
Matricula | Data | Hora | Tipo |
500163 | 23/11/2010 | 09:15 | Entrada |
500163 | 23/11/2010 | 12:18 | Saída |
500163 | 23/11/2010 | 14:05 | Entrada |
500163 | 23/11/2010 | 19:23 | Saída |
Qual seria a melhor forma de desenvolver essa tarefa ?
A. | Utilizar o comando INSERT com múltiplos valores |
B. | Criar um SET de dados com o uso do VALUES e efetuar um INSERT com SELECT |
C. | Efetuar um INSERT com um SELECT especificando o SET de dados |
D. | Não é possível inserir múltiplos valores com um único comando de INSERT. Será necessário efetuar um INSERT para cada registro desejado |
Questão 057
Você está efetuando uma manutenção em aplicação de liberação de acesso às dependências do prédio da sua empresa. Como parte do processo de segurança predial, todas as pessoas que têm registros de entrada no prédio a mais de três meses, devem ser excluídas do cadastro para que sua próxima visita force um recadastro. A figura abaixo mostra as tabelas necessárias para efetuar essa manutenção (o relacionamento entre elas não é obrigatório):
Quais dos comandos abaixo é válido para essa tarefa ?
A. | DELETE FROM Pessoas FROM Pessoas As P INNER JOIN Marcacoes As M ON P.RG = M.RG WHERE M.Data <= DateAdd(MM,-3,GETDATE()) DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE()) |
B. | DELETE FROM (Pessoas INNER JOIN Marcacoes As M ON P.RG = M.RG) WHERE M.Data <= DateAdd(MM,-3,GETDATE ()) DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE()) |
C. | DELETE Pessoas.* FROM Pessoas As P INNER JOIN Marcacoes As M ON P.RG = M.RG WHERE M.Data <= DateAdd(MM,-3,GETDATE ()) DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE()) |
D. | Todas as combinações são válidas |
Questão 058
Um desenvolvedor montou o script abaixo:
SET ANSI_NULL_DFLT_ON OFF
CREATE TABLE Lancamentos (
IDLancamento INT IDENTITY(1,1),
DataLancamento DATE DEFAULT GETDATE(),
CentroCusto CHAR(3) DEFAULT ‘ADM’,
ValorLancamento SMALLMONEY,
CONSTRAINT UQDataCentro UNIQUE (DataLancamento, CentroCusto))
INSERT INTO Lancamentos DEFAULT VALUES
Os dois primeiros comandos do script foram executados com êxito e o terceiro comando (o de INSERT) não foi executado. O que acontecerá se essa instrução de INSERT for executada múltiplas vezes com intervalos de 1 segundo em cada execução ?
A. | Ocorrerá um erro de sintaxe em todas as execuções, pois, a sintaxe apresentada não é válida |
B. | Ocorrerá um erro de execução em todas as execuções |
C. | A primeira execução será bem sucedida e as execuções subsequentes irão falhar |
D. | Todas as execuções serão bem sucedidas |
Questão 059
A empresa RFT Associados é uma empresa forte no ramo de comércio eletrônico. O banco de dados da RFT possui uma tabela central com a relação de produtos da empresa. Para evitar alterações nessa tabela durante o dia, as alterações são cadastras em uma tabela a parte para que ao final do dia, as alterações sejam efetivadas. As tabelas são exibidas na figura abaixo:
Todos os dias em um horário predeterminado, os registros na tabela "Produtos" devem ser atualizados conforme as alterações cadastradas na tabela ProdutosAlteracoes. Qual dos comandos abaixo atendem esse propósito ? Marque todos que se aplicam.
A. |
UPDATE Produtos SET |
B. |
UPDATE Produtos SET |
C. |
UPDATE Produtos SET |
D. |
UPDATE Produtos SET |
E. |
UPDATE Produtos, ProdutosAlteracoes SET |
F. |
UPDATE Produtos INNER JOIN ProdutosAlteracoes |
G. |
UPDATE Produtos SET (Nome, Valor, Estoque, Descontinuado) = ( |
Questão 060
Em um determinado sistema de compras que você está efetuando manutenção, há uma tabela de pessoas e os respectivos pontos obtidos após as compras realizadas. Como forma de gratificar os primeiros cinco clientes mais antigos (menor ID), você deseja aumentar em 1000 pontos a pontuação atual.
ID | Nome | Pontos |
01 | Marcela | 1051 |
02 | Renata | 2309 |
03 | Tatiany | 4233 |
04 | Sabrina | 3225 |
06 | Roberta | 1598 |
08 | Amanda | 1971 |
09 | Gisele | 1236 |
10 | Juliana | 5601 |
11 | Julia | 3300 |
12 | Priscila | 2437 |
Qual dos comandos abaixo pode fazer isso ?
A. | UPDATE Clientes SET Pontos = Pontos + 1000 WHERE ID <= 5 |
B. | UPDATE Clientes SET Pontos = 1000 WHERE ID <= 5 |
C. | UPDATE TOP(5) Clientes SET Pontos = Pontos + 1000 |
D. | Nenhuma das anteriores |
Questão 061
Você possui uma tabela com os seguintes registros e colunas:
ID | Nome | Usuário de Rede |
01 | Marcela Gonçalves | marcela.goncalves |
02 | Renata Maciel Costa | renata.costa |
03 | Tatiany Santos Almeida | — Não Identificado — |
04 | Sabrina Fernandes Moura | — Não Identificado — |
06 | Roberta Lins Silva | roberta.lins |
08 | Amanda Rodrigues Mendes | amanda.rodrigues |
09 | Gisele Alcântara Pinho | — Não Identificado — |
10 | Juliana Castro Ritchel | juliana.ritchel |
11 | Julia Meirelles Garcia | julia.meirelles |
12 | Priscila Prado | — Não Identificado — |
Você deseja atualizar as pessoas que estão com o login de rede preenchido com a string "– Não Identificado –" para NULL apagando assim o conteúdo da coluna para esses registros. Qual o comando mais adequado para efetuar essa operação de exclusão de conteúdo nos registros desejados ?
A. | INSERT |
B. | DELETE |
C. | UPDATE |
D. | TRUNCATE |
Questão 062
Você está efetuando manutenção em uma aplicação de cadastro institucional. Uma das principais tabelas do modelo é a tabela de Empresas Fornecedoras (EmpFor) representada pela seguinte instrução DDL:
CREATE TABLE EmpFor (
IDEmpresa INT NOT NULL Identity(1,1) PRIMARY KEY,
NomeEmpresa VARCHAR(200) NOT NULL,
NomeFantasia VARCHAR(200) NOT NULL,
CNPJ CHAR(14) NOT NULL)
O cadastro normalmente é feito com uma empresa por vez, mas eventualmente podem ser cadastradas até três empresas com uma única instrução INSERT. Após a empresa ter sido cadastrada, a coluna IDEmpresa é preenchida automaticamente com um número uma vez que essa coluna possui a propriedade Identity. A aplicação necessita apresentar o número gerado para aplicação. Qual das alternativas abaixo é a mais indicada para exibir o número gerado pela coluna Identity no cadastro das empresas ?
A. | @@Identity |
B. | SCOPE_IDENTITY( ) |
C. | IDENT_CURRENT(‘EmpFor’) |
D. | OUTPUT INSERTED.IDEmpresa |
Respostas
Questão 055
Como uma atividade rotineira de expurgo, você possui uma tabela com 50 bilhões de linhas e precisa excluir o conteúdo dessa tabela gerando o mínimo de overhead para o log de transações e bloqueios para a aplicação. Os itens abaixo devem ser levados em consideração:
- O comando deve ficar dentro de uma transação
- A tabela possui uma chave primária composta de três colunas
- A tabela não está envolvida em nenhum tipo de relacionamento
Qual seria o comando mais adequado para efetuar a exclusão dos registros ?
A. | DELETE |
B. | TRUNCATE TABLE |
C. | DROP TABLE |
D. | DBCC REINDEX(‘Tabela’) |
Resposta Correta: B
O comando TRUNCATE TABLE é capaz de excluir grandes quantidades de linhas em um tempo mínimo (alguns milissegundos na maioria dos casos) devido a sua natureza minimamente logada. É possível encapsulá-lo em transações e não há problemas em executar o comando contra tabelas que possuam chave primária independente da quantidade de colunas participantes da chave. Se a tabela estiver em um relacionamento não será possível utilizar esse comando (mesmo contra as tabelas filhas).
Respostas Incorretas: A, C, D
A – O comando DELETE é capaz de excluir qualquer quantidade de linhas de uma tabela, mas cada linha excluída será gravada no log de transações. A quantidade linhas em questão irá demandar bastante esforço e espaço do log de transações e não é a melhor alternativa nesse cenário.
C – O comando DROP TABLE exclui todos os registros de uma tabela assim como a própria tabela. Como o objetivo é o expurgo dos dados, a tabela deve permanecer no banco de dados. Mesmo sendo bastante perfomático na exclusão de registros, o comando DROP TABLE não se aplica a esse caso por excluir a tabela completamente e não só suas linhas.
D – A instrução DBCC DBREINDEX é utilizada para reconstruir os índices de uma determinada tabela ou a própria tabela. Esse comando não irá excluir os registros de uma tabela e não se aplica à situação descrita no enunciado.
Questão 056
Você está desenvolvendo uma aplicação de controle de ponto e necessita em um único comando inserir vários registros referente a entrada e saída de funcionários em uma tabela específica chamada Marcacoes.
Matricula | Data | Hora | Tipo |
500163 | 23/11/2010 | 09:15 | Entrada |
500163 | 23/11/2010 | 12:18 | Saída |
500163 | 23/11/2010 | 14:05 | Entrada |
500163 | 23/11/2010 | 19:23 | Saída |
Qual seria a melhor forma de desenvolver essa tarefa ?
A. | Utilizar o comando INSERT com múltiplos valores |
B. | Criar um SET de dados com o uso do VALUES e efetuar um INSERT com SELECT |
C. | Efetuar um INSERT com um SELECT especificando o SET de dados |
D. | Não é possível inserir múltiplos valores com um único comando de INSERT. Será necessário efetuar um INSERT para cada registro desejado |
Resposta Correta: A
Uma das novidades do SQL Server 2008 é a possibilidade de uma única instrução INSERT especificar mais de um registro a ser inserido na tabela. Ex:
INSERT INTO RegistrosPonto (Matricula, Data, Hora, Tipo)
VALUES
(500163,‘20101123’,’09:15′,‘Entrada’),
(500163,‘20101123’,’12:18′,‘Saída’),
(500163,‘20101123’,’14:05′,‘Entrada’),
(500163,‘20101123’,’19:23′,‘Saída’)
Respostas Incorretas: B, C, D
B – O uso do VALUES também é uma das novidades do Transact-SQL no SQL Server 2008 em conformidade com o padrão ANSI. Ex:
INSERT INTO RegistrosPonto (Matricula, Data, Hora, Tipo)
SELECT Matricula, Data, Hora, Tipo
FROM (VALUES
(500163,‘20101123’,’09:15′,‘Entrada’),
(500163,‘20101123’,’12:18′,‘Saída’),
(500163,‘20101123’,’14:05′,‘Entrada’),
(500163,‘20101123’,’19:23′,‘Saída’))
As RegistrosPonto (Matricula, Data, Hora, Tipo)
Embora seja uma construção válida no SQL Server 2008, ela não é tão intuitiva quanto o uso de múltiplos valores em uma instrução INSERT.
C – A especificação do SET de dados era uma alternativa comum nas versões anteriores para inserir múltiplos registros com um único comando. Ex:
INSERT INTO RegistrosPonto (Matricula, Data, Hora, Tipo)
SELECT
500163 As Matricula,‘20101123’ As Data,’09:15′ As Hora, ‘Entrada’ As Tipo
UNION ALL
SELECT 500163,‘20101123’,’12:18′,‘Saída’ UNION ALL
SELECT 500163,‘20101123’,’12:18′,‘Entrada’ UNION ALL
SELECT 500163,‘20101123’,’12:18′,‘Saída’
Embora seja uma construção válida no SQL Server 2008, ela demanda mais código que o uso de múltiplos valores com o INSERT.
D – É possível inserir com um único comando INSERT conforme demonstrado nas alternativas A, B e C.
Questão 057
Você está efetuando uma manutenção em aplicação de liberação de acesso às dependências do prédio da sua empresa. Como parte do processo de segurança predial, todas as pessoas que têm registros de entrada no prédio a mais de três meses, devem ser excluídas do cadastro para que sua próxima visita force um recadastro. As entradas mais antigas que três meses também devem ser excluídas. A figura abaixo mostra as tabelas necessárias para efetuar essa manutenção (o relacionamento entre elas não é obrigatório):
Quais dos comandos abaixo é válido para essa tarefa ?
A. | DELETE FROM Pessoas FROM Pessoas As P INNER JOIN Marcacoes As M ON P.RG = M.RG WHERE M.Data <= DateAdd(MM,-3,GETDATE()) DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE()) |
B. | DELETE FROM (Pessoas INNER JOIN Marcacoes As M ON P.RG = M.RG) WHERE M.Data <= DateAdd(MM,-3,GETDATE()) DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE()) |
C. | DELETE Pessoas.* FROM Pessoas As P INNER JOIN Marcacoes As M ON P.RG = M.RG WHERE M.Data <= DateAdd(MM,-3,GETDATE()) DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE()) |
D. | Todas as combinações são válidas |
Resposta Correta: A
A tabeça Marcacoes faz a gravação das marcações das pessoas que entraram no prédio. Para saber as pessoas que entraram no prédio a mais de três meses é necessário efetuar uma junção dessa tabela com a tabela Pessoas para efetuar a exclusão das pessoas que tem registros a mais de três meses. Posteriormente é feita a exclusão das marcações. Apenas a sintaxe na alternativa A é válida no SQL Server (embora a junção proposta não esteja em conformidade com o padrão ANSI sendo portanto uma extensão proprietária).
Respostas Incorretas: B, C, D
B, C, D – Essas não são sintaxes válidas no SQL Server (embora algumas delas funcionem em outros SGBDs com o Access, MySQL, etc)
Questão 058
Um desenvolvedor montou o script abaixo:
SET ANSI_NULL_DFLT_ON OFF
CREATE TABLE Lancamentos (
IDLancamento INT IDENTITY(1,1),
DataLancamento DATE DEFAULT GETDATE(),
CentroCusto CHAR(3) DEFAULT ‘ADM’,
ValorLancamento SMALLMONEY,
CONSTRAINT UQDataCentro UNIQUE (DataLancamento, CentroCusto))
INSERT INTO Lancamentos DEFAULT VALUES
Os dois primeiros comandos do script foram executados com êxito e o terceiro comando (o de INSERT) não foi executado. O que acontecerá se essa instrução de INSERT for executada múltiplas vezes com intervalos de 1 segundo em cada execução ?
A. | Ocorrerá um erro de sintaxe em todas as execuções, pois, a sintaxe apresentada não é válida |
B. | Ocorrerá um erro de execução em todas as execuções |
C. | A primeira execução será bem sucedida e as execuções subsequentes irão falhar |
D. | Todas as execuções serão bem sucedidas |
Resposta Correta: B
O comando INSERT INTO [Tabela | View] DEFAULT VALUES faz com que seja gerado um novo registro com os valores padrão estabelecidos. Se houver um coluna Identity, ela será incrementada. Se houver uma coluna com uma CONSTRAINT DEFAULT, o valor especificado na CONSTRAINT será incluído, se uma coluna não tiver nenhum valor Default e (ou) valores Identity, ela será preenchida como nula.
O primeiro INSERT produziria o valor 1 para a coluna IDLancamento, a data e hora atuais para a coluna DataLancamento, a string "ADM" para a coluna CentroCusto e o valor NULL para a coluna ValorLancamento. Como a primeira instrução é SET ANSI_NULL_DFLT_ON OFF, por padrão colunas são criadas como NOT NULL. A instrução INSERT com DEFAULT VALUES irá produzir o valor NULL para a coluna ValorLancamento (ela não possui Default) provocando um erro na execução do comando independente da quantidade de execuções, pois, a coluna ValorLancamento não aceita valores nulos.
Respostas Incorretas: A, C, D
A – A construção é válida e não apresenta erros de sintaxe. As falhas na execução se dão por restrições a valores nulos e não por erros de sintaxe.
C – Não há como a primeira execução ser bem sucedida, pois, há uma violação em relação à nulabilidade da coluna ValorLancamento. Se a coluna ValorLancamento permitisse valores nulos essa opção seria a correta. Ainda que haja uma constraint Unique com as colunas DataLancamento e CentroCusto, se cada INSERT fosse executado a cada segundo, o valor da coluna seria diferente. Entretanto, como o tipo de dados é DATE e esse tipo não grava os segundos, haveria uma repetição dos valores dessas colunas provocando a violação da constraint unique para os registros subsequentes.
D – Nenhuma execução pode ser bem sucedida, pois, há uma violação em relação à coluna ValorLancamento.
Questão 059
A empresa RFT Associados é uma empresa forte no ramo de comércio eletrônico. O banco de dados da RFT possui uma tabela central com a relação de produtos da empresa. Para evitar alterações nessa tabela durante o dia, as alterações são cadastras em uma tabela a parte para que ao final do dia, as alterações sejam efetivadas. As tabelas são exibidas na figura abaixo:
Todos os dias em um horário predeterminado, os registros na tabela "Produtos" devem ser atualizados conforme as alterações cadastradas na tabela ProdutosAlteracoes. Qual dos comandos abaixo atendem esse propósito ? Marque todos que se aplicam.
A. |
UPDATE Produtos SET |
B. |
UPDATE Produtos SET |
C. |
UPDATE Produtos SET |
D. |
UPDATE Produtos SET |
E. |
UPDATE Produtos, ProdutosAlteracoes SET |
F. |
UPDATE Produtos INNER JOIN ProdutosAlteracoes |
G. |
UPDATE Produtos SET (Nome, Valor, Estoque, Descontinuado) = ( |
Respostas Corretas: A, C, D
A – Para atualizar uma tabela com base em outro com um único UPDATE é necessário relacionar as tabelas e efetuar a atualização em apenas uma das tabelas (não é possível atualizar duas tabelas com uma única instrução de UPDATE). A sintaxe apresentada é válida no SQL Server embora não esteja em conformidade com o padrão ANSI.
C – A lógica dessa alternativa é idêntica a da alternativa A, exceto pela forma a qual o JOIN foi realizado. Ao invés de usar os operadores de junção (INNER JOIN), a junção foi feita pela cláusula WHERE. Essa é uma sintaxe válida no SQL Server embora não esteja em conformidade com o padrão ANSI.
D – Esse comando é semelhante a da alternativa A, mas há uma particularidade. A tabela a ser atualizada (Produtos) é referenciada logo após o comando UPDATE e somente a tabela de referência (ProdutosAtualizacoes) é referenciada pela cláusula FROM. É uma opção confusa, pois, a referência à tabela Produtos na cláusula FROM juntamente com a tabela ProdutosAlteracoes deixaria o comando mais claro como na alternativa A. A sintaxe é válida no SQL Server embora não esteja em conformidade com o padrão ANSI.
Respostas Incorretas: B, E, F, G
B – A construção é muito semelhante a da alternativa A, mas há um erro de semântica. O UPDATE faz referência à tabela Produtos (UPDATE Produtos SET), mas faz uso do Alias POld para se referir a essa tabela e as colunas alvo de atualização. A referência direta à tabela Produtos antes do operador SET irá anular as referências ao Alias POld retornando um erro de referência "The multi-part identifier "POld.Name" could not be bound"
E – No SQL Server não é possível referenciar duas tabelas para alteração em um mesmo comando. Essa não alternativa corresponde a um erro de sintaxe no SQL Server. Embora não seja válida no SQL Server e não esteja aderente ao padrão ANSI, é uma sintaxe válida no MySQL.
F – O JOIN deve ser feito após a especificação das colunas alteradas e não antes. Essa não alternativa corresponde a um erro de sintaxe no SQL Server. Embora não seja válida no SQL Server e não esteja aderente ao padrão ANSI, é uma sintaxe válida no Access.
G – Essa alternativa é a alternativa prevista pelo padrão ANSI sendo aceita por bancos como o ORACLE e o DB2. Embora seja a recomendação do ANSI, essa opção gera um erro de sintaxe no SQL Server.
Questão 060
Em um determinado sistema de compras que você está efetuando manutenção, há uma tabela de pessoas e os respectivos pontos obtidos após as compras realizadas. Como forma de gratificar os primeiros cinco clientes mais antigos (menor ID), você deseja aumentar em 1000 pontos a pontuação atual.
ID | Nome | Pontos |
01 | Marcela | 1051 |
02 | Renata | 2309 |
03 | Tatiany | 4233 |
04 | Sabrina | 3225 |
06 | Roberta | 1598 |
08 | Amanda | 1971 |
09 | Gisele | 1236 |
10 | Juliana | 5601 |
11 | Julia | 3300 |
12 | Priscila | 2437 |
Qual dos comandos abaixo pode fazer isso ?
A. | UPDATE Clientes SET Pontos = Pontos + 1000 WHERE ID <= 5 |
B. | UPDATE Clientes SET Pontos = 1000 WHERE ID <= 5 |
C. | UPDATE TOP(5) Clientes SET Pontos = Pontos + 1000 |
D. | Nenhuma das anteriores |
Resposta Correta: C
A partir do SQL Server 2005, é permitido o uso do TOP em instruções de INSERT, UPDATE e DELETE. Essa instrução irá atualizar os cinco primeiros registros da tabela.
Respostas Incorretas: A, B, D
A – Os cincos primeiros registros possuem ID igual a 01, 02, 03, 04 e 06, pois, há um GAP e o ID 05 não existe. Assim sendo, o predicado WHERE ID <= 5 contemplaria apenas os cinco primeiros registros.
B – Além de não contemplar os cinco primeiros registros, essa alternativa não aumenta os pontos dos clientes, mas fixa a pontuação em 1.000
D – A alternativa correta é a C.
Questão 061
Você possui uma tabela com os seguintes registros e colunas:
ID | Nome | Usuário de Rede |
01 | Marcela Gonçalves | marcela.goncalves |
02 | Renata Maciel Costa | renata.costa |
03 | Tatiany Santos Almeida | — Não Identificado — |
04 | Sabrina Fernandes Moura | — Não Identificado — |
06 | Roberta Lins Silva | roberta.lins |
08 | Amanda Rodrigues Mendes | amanda.rodrigues |
09 | Gisele Alcântara Pinho | — Não Identificado — |
10 | Juliana Castro Ritchel | juliana.ritchel |
11 | Julia Meirelles Garcia | julia.meirelles |
12 | Priscila Prado | — Não Identificado — |
Você deseja atualizar as pessoas que estão com o login de rede preenchido com a string "– Não Identificado –" para NULL apagando assim o conteúdo da coluna para esses registros. Qual o comando mais adequado para efetuar essa operação de exclusão de conteúdo nos registros desejados ?
A. | INSERT |
B. | DELETE |
C. | UPDATE |
D. | TRUNCATE |
Resposta Correta: C
O comando UPDATE é capaz de substituir a string "– Não Identificado –" para NULL atualizando a coluna "’Usuário de Rede". O comando é exposto abaixo:
UPDATE <Tabela> SET [Usuário de Rede] = NULL WHERE [Usuário de Rede] = ‘– Não Identificado –‘
Respostas Incorretas: A, B, D
A – O comando INSERT faz a inserção de novos registros e não é capaz de efetuar qualquer alteração nos registros já existentes.
B – O comando DELETE exclui registros em sua totalidade, ou seja, todas a linha e suas colunas e não pode ser utilizado para substituir valores.
C – O comando TRUNCATE é utilizado para exclusões de todos os registros de uma tabela específica e não pode ser utilizado para atualizações.
Questão 062
Você está efetuando manutenção em uma aplicação de cadastro institucional. Uma das principais tabelas do modelo é a tabela de Empresas Fornecedoras (EmpFor) representada pela seguinte instrução DDL:
CREATE TABLE EmpFor (
IDEmpresa INT NOT NULL Identity(1,1) PRIMARY KEY,
NomeEmpresa VARCHAR(200) NOT NULL,
NomeFantasia VARCHAR(200) NOT NULL,
CNPJ CHAR(14) NOT NULL)
O cadastro normalmente é feito com uma empresa por vez, mas eventualmente podem ser cadastradas até três empresas com uma única instrução INSERT. Após a empresa ter sido cadastrada, a coluna IDEmpresa é preenchida automaticamente com um número uma vez que essa coluna possui a propriedade Identity. A aplicação necessita apresentar o número gerado para aplicação. Qual das alternativas abaixo é a mais indicada para exibir o número gerado pela coluna Identity no cadastro das empresas ?
A. | @@Identity |
B. | SCOPE_IDENTITY( ) |
C. | IDENT_CURRENT(‘EmpFor’) |
D. | OUTPUT INSERTED.IDEmpresa |
Resposta Correta: D
Uma vez que o cadastro pode ser feito com mais de uma empresa simultaneamente, será preciso retornar mais de um ID simultaneamente. A cláusula OUTPUT possibilita mostrar os valores inseridos após o comando de INSERT ter sido disparado. Essa cláusula pode ainda ser utilizada com instruções de UPDATE e DELETE possibilitando visualizar os registros antes e depois da alteração e os registros excluídos respectivamente. A cláusula OUTPUT faz uso das tabelas INSERTED e DELETED que são utilizadas em triggers. O comando para obter os números gerados é exibido logo a seguir:
— Insere duas empresas
INSERT INTO EmpFor (NomeEmpresa, NomeFantasia, CNPJ)
OUTPUT Inserted.IDEmpresa, Inserted.NomeEmpresa VALUES
(‘The Home Of Music’,‘HOM’,‘10324394000123’),
(‘PVD Productions’,‘PVK’,‘10256785400014’)
Respostas Incorretas: A, B, C
A, B, C – Essas funções são capazes de recuperar apenas o último Identity inserido. Se o cadastro fosse baseado em uma empresa por vez, seria alternativas a serem avaliadas, mas com a possibilidade de múltiplos cadastros em um único comando, elas não são alternativas válidas, pois, não conseguem recuperar o último número gerado. A função IDENT_CURRENT também é desacolhável em ambientes de maior concorrência.
[ ]s,
Gustavo