Simulado para o Exame 70-433 – MCTS: Microsoft SQL Server 2008 – Database Development – Parte 07

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
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos
INNER JOIN ProdutosAlteracoes ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

B.

UPDATE Produtos SET
    POld.Nome = PNew.Nome, POld.Valor = PNew.Valor,
    POld.Estoque = PNew.Estoque, POld.Descontinuado = PNew.Descontinuado
FROM Produtos As POld
INNER JOIN ProdutosAlteracoes As PNew ON POld.ProdutoID = PNew.ProdutoID

C.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos, ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

D.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

E.

UPDATE Produtos, ProdutosAlteracoes SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado
WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

F.

UPDATE Produtos INNER JOIN ProdutosAlteracoes
    ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado

G.

UPDATE Produtos SET (Nome, Valor, Estoque, Descontinuado) = (
    SELECT Nome, Valor, Estoque, Descontinuado FROM ProdutosAlteracoes
    WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)
WHERE EXISTS (SELECT 1 FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)

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
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos
INNER JOIN ProdutosAlteracoes ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

B.

UPDATE Produtos SET
    POld.Nome = PNew.Nome, POld.Valor = PNew.Valor,
    POld.Estoque = PNew.Estoque, POld.Descontinuado = PNew.Descontinuado
FROM Produtos As POld
INNER JOIN ProdutosAlteracoes As PNew ON POld.ProdutoID = PNew.ProdutoID

C.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos, ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

D.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

E.

UPDATE Produtos, ProdutosAlteracoes SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado
WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

F.

UPDATE Produtos INNER JOIN ProdutosAlteracoes
    ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado

G.

UPDATE Produtos SET (Nome, Valor, Estoque, Descontinuado) = (
    SELECT Nome, Valor, Estoque, Descontinuado FROM ProdutosAlteracoes
    WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)
WHERE EXISTS (SELECT 1 FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)

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

7 Respostas para “Simulado para o Exame 70-433 – MCTS: Microsoft SQL Server 2008 – Database Development – Parte 07

  1. Pingback: Materiais de Estudo | Luiz Phellipe

  2. Olá Gustavo tudo bem,

    Antes de tudo, parabéns pelo post, ótima forma para os leitores praticarem seus conhecimentos.

    Fiz os exercícios errando apenas as 56,59,60,62 um aproveitamento de 50%.

    Tenho uma duvida quanto a alternativa numero 60. E acreditava que que a resposta correta era a A mas depois que li o comentario da resolução notei que cai em uma pegadinha por está desatento aos detalhes.

    Porém minha duvida é o seguinte o uso do top não implica em um order by. Pois quem garante que o top 5 vai retorna de forma ordenada e crescente.
    Já presenciei casos em que no ‘select’ um top 10 traz o resultado de forma aleatória. Não obedecendo a ordem de inserção.

    na questão não é informado se a coluna ID possui, primary key, indice, ou qualquer outra informação que justifique que o top vai os 5 primeiros registro.

    Não sei se consegui passar a visão que estou tendo dessa questão.

    Obrigado pela atenção até mas..

    • Oi Tiago,

      Pois é. A pegadinha foi de propósito (rs). Atenção é tão importante quanto conhecimento (rs).
      Quanto ao ORDER BY você está corretíssimo. O TOP não inclui um ORDER BY e digamos que a alternativa não estaria 100% correta. Mas mesmo nas provas da Microsoft, há esse tipo de situação, ou seja, enquanto na maioria das vezes você tem que procurar a mais certa, algumas vezes você tem que procurar a menos errada. O correto mesmo seria:

      ;WITH Cli As (SELECT TOP(5) * FROM Clientes ORDER BY ID)
      UPDATE Cli SET Pontos = Pontos + 1000

      [ ]s,

      Gustavo

  3. ola, bom dia, vou começar a estudar para o exame 70-433, o seu material é de excelente qualidade, você ira postar mais questoes? muito obrigado pela sua iniciativa em nos ajudar, e se puder me oriente sobre qual outro material necessário para este exame. Um grande abraço.

    • Oi Efrain,

      Comecei montar os simulados na época em que meu blog era no live. O wordpress tem muitos recursos interessantes, mas o fato dele desformatar me fez perder o tesão em postar mais. Ainda tenho mais algumas quinze questões só, mas que acabei não postando. Vou ver se faço isso qualquer hora dessa.

      Há um blog dedicado a prova 70-433 que poderá ajudá-lo tenho certeza. Dê uma olhada em http://estudandopara70433.wordpress.com/

      [ ]s,

      Gustavo

  4. Pingback: Simulado para o Exame 70-433 – MCTS: Microsoft SQL Server 2008 – Database Development – Parte 07 | Gustavo Maia Aguiar « Theodozio

  5. Pingback: Simulados para a prova 70-432 « Alex Souza

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s