Consultas SQL
Upcoming SlideShare
Loading in...5
×
 

Consultas SQL

on

  • 12,917 views

Material de apoio que reune uma selação de conteúdos interessantes, referente ao Microsoft SQL Server.

Material de apoio que reune uma selação de conteúdos interessantes, referente ao Microsoft SQL Server.

Statistics

Views

Total Views
12,917
Views on SlideShare
12,916
Embed Views
1

Actions

Likes
3
Downloads
264
Comments
0

1 Embed 1

http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Consultas SQL Consultas SQL Document Transcript

  • Consultas SQL Server 1 - MANIPULAÇÃO DE DADOS SELECT select_list [ INTO new_table_name ] FROM table_list [ WHERE search_conditions ] [ GROUP BY group_by_list ] [ HAVING search_conditions ] [ ORDER BY order_list [ ASC | DESC ] ] select_list Descreve as colunas do conjunto de resultados. É uma lista de expressões separadas por vírgulas. Cada expressão define o formato (tipo de dados e tamanho) e a fonte dos dados para a coluna do conjunto de resultados. Cada expressão de lista de seleção é tipicamente uma referência a uma coluna na tabela de origem ou exibição de onde os dados provêm, mas pode ser qualquer outra expressão, como uma constante ou uma função Transact-SQL. O uso da expressão * em uma lista de seleção especifica que todas as colunas da tabela de origem são retornadas. INTO new_table_name Especifica que o conjunto de resultados é usado para criar uma nova tabela. new_table_name especifica o nome da tabela nova. FROM table_list Contém uma lista das tabelas das quais os dados do conjunto de resultados são recuperados. Essas fontes podem ser: Tabelas base no servidor local que executa o SQL Server. Exibições na instância local do SQL Server. O SQL Server resolve internamente uma referência de exibição para referências nas tabelas base que compõem a exibição. Tabelas vinculadas. São tabelas em fontes de dados OLE DB que podem ser acessadas pelo SQL Server. Isso é referido como consulta distribuída. Fontes de dados OLE DB podem ser acessadas no SQL Server vinculando-as como servidor vinculado ou referenciando a fonte de dados em uma função OPENROWSET ou OPENQUERY. A cláusula FROM também pode conter especificações de junção. Isso define o caminho específico que o SQL Server deverá usar para navegar de uma tabela para outra. A cláusula FROM também é usada nas instruções DELETE e UPDATE para definir as tabelas que são modificadas. WHERE search_conditions A cláusula WHERE é um filtro que define as condições que cada linha das tabelas de origem deve atender para qualificar-se para a cláusula SELECT. Apenas linhas que atendem às condições colaboram com dados para o conjunto de resultados. Dados de linhas que não atendem às condições não são usados. Desenvolvido por: Alexandre G. Silva Pág. 1 de 18 TOTVS – ES 04/09/2010
  • Consultas SQL Server A cláusula WHERE também é usada nas instruções DELETE e UPDATE para definir as linhas nas tabelas de destino que são modificadas. GROUP BY group_by_list A cláusula GROUP BY divide o conjunto de resultados em grupos baseados nos valores das colunas do group_by_list. Por exemplo, a tabela AdventureWorks Sales.SalesOrderHeader tem dez valores em TerritoryID. Uma cláusula GROUP BY TerritoryID divide o conjunto de resultados em 10 grupos, um para cada valor de TerritoryID. HAVING search_conditions A cláusula HAVING é um filtro adicional que é aplicado ao conjunto de resultados. Logicamente, a cláusula HAVING filtra linhas do conjunto de resultados intermediário construído com a aplicação de quaisquer cláusulas FROM, WHERE ou GROUP BY na instrução SELECT. As cláusulas HAVING são tipicamente usadas com uma cláusula GROUP BY, embora uma cláusula GROUP BY não seja necessária antes de uma cláusula HAVING. ORDER BY order_list[ ASC | DESC ] A cláusula ORDER BY define a ordem na qual são classificadas as linhas no conjunto de resultados. order_list especifica as colunas do conjunto de resultados que compõem a lista de classificação. As palavras-chaves ASC e DESC são usadas para especificar se as linhas são classificadas em seqüência ascendente ou descendente. ORDER BY é importante porque a teoria relacional especifica que não se pode pressupor que as linhas de um conjunto de resultados tenham qualquer seqüência, a menos que ORDER BY seja especificado. ORDER BY deve ser usado em qualquer instrução SELECT para a qual a ordem das linhas do conjunto de resultados seja importante. As cláusulas de uma declaração SELECT devem ser especificadas na ordem adequada. Cada referência a um objeto do banco de dados deve ser inequívoca. A ambigüidade pode vir das seguintes fontes: Pode haver vários objetos que têm o mesmo nome em um sistema. Por exemplo, Schema1 e Schema2 podem ter uma tabela nomeada TableX. Para resolver a ambigüidade e especificar o objeto TableX possuído por Schema1, qualifique o nome de tabela pelo menos com o nome do esquema: Exemplo: SELECT * FROM Schema1.TableX O banco de dados no qual o objeto reside pode nem sempre ser o banco de dados atual quando a instrução SELECT é executada. Para ter certeza de que o objeto correto sempre é usado, independentemente da configuração do banco de dados atual, qualifique o nome de objeto com o banco de dados e o esquema: Exemplo: SELECT * FROM AdventureWorks.Purchasing.ShipMethod Desenvolvido por: Alexandre G. Silva Pág. 2 de 18 TOTVS – ES 04/09/2010
  • Consultas SQL Server As tabelas e exibições especificadas na cláusula FROM podem ter nomes de coluna duplicados. Freqüentemente, chaves estrangeiras terão o mesmo nome de coluna que sua chave primária relacionada. Para resolver a ambigüidade entre nomes duplicados, o nome de coluna deve ser qualificado com o nome da tabela ou nome de exibição: Exemplo: SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name FROM Sales.Customer JOIN Sales.Store ON ( Sales.Customer.CustomerID = Sales.Store.CustomerID) WHERE Sales.Customer.TerritoryID = 1 Essa sintaxe fica muito grande quando os nomes de tabela e de exibição tiverem que ser qualificados completamente. Você pode resolver esse problema atribuindo um nome de correlação, também conhecido como uma variável de intervalo ou alias, à tabela, usando a palavra-chave AS na cláusula FROM. O nome de tabela ou de exibição completamente qualificado tem de ser especificado apenas na cláusula FROM. Todas as outras referências a tabelas ou exibições podem então usar o nome de correlação. Aplicar nomes de correlação e qualificar as tabelas completamente na amostra anterior cria esta instrução SELECT: Exemplo: SELECT DISTINCT c.CustomerID, s.Name FROM Sales.Customer AS c JOIN Sales.Store AS s ON ( c.CustomerID = s.CustomerID) WHERE c.TerritoryID = 1 Para obter mais informações sobre qualificação de objeto, consulte Identificadores. Nos Manuais Online do SQL Server, muitos exemplos de Transact-SQL estão simplificados por não se usarem nomes qualificados. Embora esses elementos não estejam incluídos nos exemplos, a fim de facilitar a legibilidade, recomendamos que você use nomes qualificados em instruções Transact-SQL em sistemas de produção. Desenvolvido por: Alexandre G. Silva Pág. 3 de 18 TOTVS – ES 04/09/2010
  • Consultas SQL ServerFunções de agregação. FUNÇÃO DESCRIÇÃOMIN() Menor valor do conjunto de valores passados como parâmetro.MAX() Maior valor do conjunto de valores passados como parâmetro.AVG() Média normal do conjunto de valores passados como parâmetro.SUM() Soma do conjunto de valores passados como parâmetro.COUNT() Contador do tipo de valores passados como parâmetro.Operadores lógicos. OPERADOR DESCRIÇÃO= Igualdade<> Desigualdade> Maior que< Menor que>= Maior ou igual a<= Menor ou igual a!> Não maoir que!< Não menor que!= Não igualFonte de pesquisa: http://go.microsoft.com/fwlink/?LinkID=127251Desenvolvido por: Alexandre G. Silva Pág. 4 de 18TOTVS – ES 04/09/2010
  • Consultas SQL Server 2 - TRABALHANDO COM MÚLTIPLAS TABELAS As condições de junção podem ser especificadas nas cláusulas FROM ou WHERE, sendo recomendado que sejam especificadas na cláusula FROM. As cláusulas WHERE e HAVING também podem conter critérios de pesquisa para filtrar ainda mais as linhas selecionadas pelas condições de junção. As junções podem ser categorizadas como: Junções internas (a operação de junção típica como a que usa algum operador de comparação como = ou <>). Esses incluem junções naturais e junções por igualdade. As junções internas usam um operador de comparação para relacionar duas tabelas com base nos valores em colunas comuns de cada tabela. Por exemplo, ao recuperar todas as linhas em que o número de identificação do aluno é o mesmo em ambas as tabelas alunos e cursos. Junções externas. As junções externas pode ser uma junção externa esquerda, direita ou junção externa completa. As junções externas são especificadas com um dos seguintes conjuntos de palavras-chave quando elas são especificadas na cláusula FROM: LEFT JOIN ou LEFT OUTER JOIN O conjunto de resultados de uma junção externa inclui todas as linhas de uma tabela esquerda especificadas na cláusula LEFT OUTER, não somente aquelas nas quais as colunas unidas se correspondem. Quando uma linha na tabela esquerda não possui linhas correspondentes na tabela direita, a linha associada ao conjunto de resultados conterá valores nulos para todas as colunas da lista de seleção vindos da tabela direita. RIGHT JOIN ou RIGHT OUTER JOIN Uma junção externa direita é o oposto de uma junção externa esquerda. São retornadas todas as linhas da tabela direita. São retornados valores nulos para a tabela esquerda sempre que uma tabela direita não possuir alguma linha de correspondência na tabela esquerda. FULL JOIN ou FULL OUTER JOIN Uma junção externa completa retorna todas as linhas em ambas as tabelas direita e esquerda. Sempre que uma linha não tiver correspondência com a outra tabela, as colunas da lista de seleção da outra tabela conterão valores nulos. Quando houver correspondência entre as tabelas, todas as linhas do conjunto de resultados conterão valores de dados de tabelas base. CROSS JOIN Uma junção cruzada sem uma cláusula WHERE produz o produto cartesiano das tabelas envolvidas na junção. O tamanho do conjunto de resultados do produto cartesiano é o número de linhas na primeira tabela multiplicado pelo número de linhas na segunda tabela. O exemplo a seguir mostra junção cruzada Transact-SQL. Desenvolvido por: Alexandre G. Silva Pág. 5 de 18 TOTVS – ES 04/09/2010
  • Consultas SQL Server Exemplo: USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p CROSS JOIN Sales.SalesTerritory t ORDER BY p.SalesPersonID; O conjunto de resultados contém 170 linhas (SalesPerson tem 17 linhas e SalesTerritory tem 10; 17 multiplicado por 10 é igual a 170). Porém, se uma cláusula WHERE for adicionada, a junção cruzada se comportará como uma junção interna. Por exemplo, a consulta Transact-SQL a seguir produz o mesmo conjunto de resultados. Exemplo: USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p CROSS JOIN Sales.SalesTerritory t WHERE p.TerritoryID = t.TerritoryID ORDER BY p.SalesPersonID; -- Or USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p INNER JOIN Sales.SalesTerritory t ON p.TerritoryID = t.TerritoryID ORDER BY p.SalesPersonID; Fonte: http://go.microsoft.com/fwlink/?LinkID=127303 Desenvolvido por: Alexandre G. Silva Pág. 6 de 18 TOTVS – ES 04/09/2010
  • Consultas SQL Server3 - EXERCÍCIOS1 - Selecione os nomes, em ordem alfabética, de todos os funcionários da Matriz (filial 1), bem comoo código da filial.2 - Selecione o código do tipo de movimento, o nome, o valor bruto, numero do movimento e datade emissão.3 - Selecione a quantidade de ordem de compras agrupando pelo mês de emissão.4 - Selecione a soma dos lançamentos financeiros a receber que estão em aberto agrupados porfornecedor.5 - Faça uma listagem de produtos contendo o código do produto, nome, unidade de controle,unidade de venda, unidade de compra de todos os produtos da tabela de produtos. Ordenar osprodutos por código.6 – Listagem de produtos que foram movimentados no mês de abril de 2005 no movimento deordem de compras, trazer o código do produto, nome fantasia, numero do movimento, data deemissão e valor liquido.7 – Liste os produtos que tiveram ordem de compra cujo o valor total do item seja maior que1000(mil), trazer como informação: numero do movimento, numero de sequência, código doproduto, valor total.8 – listar todas as ordens de compra que não estiverem canceladas e foram emitidas no mês defevereiro de 2006, trazendo o numero da ordem de compra, o valor bruto, valor liquido, subtotal.Desenvolvido por: Alexandre G. Silva Pág. 7 de 18TOTVS – ES 04/09/2010
  • Consultas SQL Server4 – TRABALHANDO COM FUNÇÕESFunções escalaresAs funções escalares definidas pelo usuário retornam um único valor de dados do tipo definido nacláusula RETURNS. Para uma função escalar embutida, não há nenhum corpo de função; o valorescalar é o resultado de uma única instrução. Para uma função escalar com várias instruções, ocorpo da função, definido em um bloco BEGIN…END, contém uma série de instruções do Transact-SQL que retornam o valor único. O tipo de retorno pode ser em qualquer tipo de dados, excetotexto, ntext, imagem, cursor e carimbo de data/hora.Funções com valor de tabelaAs funções com valor de tabela definidas pelo usuário retornam um tipo de dados de tabela. Parauma função com valor de tabela embutida, não há corpo de função; a tabela é o conjunto deresultados de uma única instrução SELECT.Para uma função com valor de tabela com várias instruções, o corpo de função, definido em umbloco BEGIN... END, contém uma série de instruções do Transact-SQL que criam e inserem linhas natabela que será retornada.Funções internasAs funções internas são fornecidas pelo SQL Server para ajudar você a executar uma variedade deoperações. Elas não podem ser modificadas. Você pode usar funções internas em instruções doTransact-SQL para:  Acessar informações de tabelas do sistema SQL Server sem acessar os tabelas do sistema diretamente.  Executar tarefas comuns como SUM, GETDATE ou IDENTITY.Funções internas retornam os tipos de dados escalar ou de tabela. Por exemplo, @@ERROR retorna0 se a última instrução do Transact-SQL tiver sido executada com êxito. Se a instrução gerou umerro, @@ERROR retorna o número do erro. E a função SUM(parameter) retorna a soma de todos osvalores do parâmetro.Abaixo uma tabela contendo algumas funções internas que podem ser bastante úteis Função DescriçãoAPP_NAME Retorna o nome do aplicativo para a sessão atual se definido pelo aplicativoExpressão CASE Avalia uma lista de condições e retorna uma das várias expressões de resultado possíveis.CAST e CONVERT Converte uma expressão de um tipo de dados para outro.Desenvolvido por: Alexandre G. Silva Pág. 8 de 18TOTVS – ES 04/09/2010
  • Consultas SQL ServerCOALESCE Retorna a primeira expressão não nula entre seus argumentos.COLLATIONPROPERTY Retorna a propriedade do agrupamento especificado. Retorna um padrão de bit varbinary que indica as colunas de uma tabelaCOLUMNS_UPDATED ou exibição que foram inseridas ou atualizadas. Retorna o carimbo de data e hora do sistema do banco de dados atual comoCURRENT_TIMESTAMP um valor datetime sem o deslocamento de fuso horário do banco de dados.CURRENT_USER Retorna o nome do usuário atual. Retorna o número de bytes usado para representar qualquer expressão. ÉDATALENGTH bem similar a função LEN()Funções escalaresAs funções escalares definidas pelo usuário retornam um valor único de dados do tipo definido nacláusula RETURNS. Para uma função escalar embutida, não há um corpo de função; o valor escalar éo resultado de uma única instrução. Para uma função escalar de várias instruções, o corpo dafunção, definido em um bloco BEGIN...END, contém uma série de instruções Transact-SQL, queretornam o valor único. O tipo de retorno pode ser qualquer tipo de dados, exceto text, ntext,image, cursore timestamp.Os exemplos a seguir criam uma função escalar de várias instruções. A função pega um valor deentrada, um ProductID, e retorna um único valor de dados, a quantidade agregada do produtoespecificado no inventário.Exemplo:USE AdventureWorks2008R2;GOIF OBJECT_ID (Ndbo.ufnGetInventoryStock, NFN) IS NOT NULL DROP FUNCTION ufnGetInventoryStock;GOCREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)RETURNS intAS-- Returns the stock level for the product.BEGIN DECLARE @ret int; SELECT @ret = SUM(p.Quantity) FROM Production.ProductInventory p WHERE p.ProductID = @ProductID AND p.LocationID = 6; IF (@ret IS NULL)Desenvolvido por: Alexandre G. Silva Pág. 9 de 18TOTVS – ES 04/09/2010
  • Consultas SQL Server SET @ret = 0; RETURN @ret;END;GOO exemplo a seguir usa a função ufnGetInventoryStock, para retornar a quantidade atual doinventário dos produtos que têm um ProductModelIDentre 75 e 80.Exemplo:USE AdventureWorks2008R2;GOSELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS CurrentSupplyFROM Production.ProductWHERE ProductModelID BETWEEN 75 and 80;GOFunções com valor de tabelaAs funções com valor de tabela definidas pelo usuário retornam um tipo de dados table. Para umafunção com valor de tabela embutida, não há um corpo de função; a tabela é o conjunto deresultados de uma única instrução SELECT.O exemplo a seguir cria uma função com valor de tabela embutida. A função pega um parâmetro deentrada, um ID cliente (loja), e retorna as colunas ProductID, Name e a agregação das vendas doano, até a data atual, como YTD Total para cada produto vendido para a loja.Exemplo:USE AdventureWorks2008R2;GOIF OBJECT_ID (NSales.ufn_SalesByStore, NIF) IS NOT NULL DROP FUNCTION Sales.ufn_SalesByStore;GOCREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)RETURNS TABLEASRETURN( SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS Total FROM Production.Product AS P JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID WHERE C.StoreID = @storeid GROUP BY P.ProductID, P.Name);GOO exemplo a seguir invoca a função e especifica a ID do cliente 602.Desenvolvido por: Alexandre G. Silva Pág. 10 de 18TOTVS – ES 04/09/2010
  • Consultas SQL ServerExemplo:SELECT * FROM Sales.ufn_SalesByStore (602);Para uma função com valor de tabela de várias instruções, o corpo da função definido em um blocoBEGIN...END contém uma série de instruções Transact-SQL, que criam e inserem linhas na tabelaque será retornada.O exemplo a seguir cria uma função com valor de tabela. A função toma um único parâmetro deentrada, um EmployeeID e retorna uma lista de todos os funcionários que reportam direta ouindiretamente ao funcionário especificado. A função que especifica a ID do funcionário 109 éinvocada em seguida.Exemplo:USE AdventureWorks2008R2;GOIF OBJECT_ID (Ndbo.ufn_FindReports, NTF) IS NOT NULL DROP FUNCTION dbo.ufn_FindReports;GOCREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)RETURNS @retFindReports TABLE( EmployeeID int primary key NOT NULL, FirstName nvarchar(255) NOT NULL, LastName nvarchar(255) NOT NULL, JobTitle nvarchar(50) NOT NULL, RecursionLevel int NOT NULL)--Returns a result set that lists all the employees who report to the--specific employee directly or indirectly.*/ASBEGINWITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) --CTE name and columns AS ( SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Getthe initial list of Employees for Manager n FROM HumanResources.Employee e INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = @InEmpID UNION ALL SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle,RecursionLevel + 1 -- Join recursive member to anchor FROM HumanResources.Employee e INNER JOIN EMP_cte ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID )-- copy the required columns to the result of the function INSERT @retFindReportsDesenvolvido por: Alexandre G. Silva Pág. 11 de 18TOTVS – ES 04/09/2010
  • Consultas SQL Server SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel FROM EMP_cte RETURNEND;GO-- Example invocationSELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevelFROM dbo.ufn_FindReports(1);GOFonte: http://msdn.microsoft.com/en-us/library/ms177499.aspxDesenvolvido por: Alexandre G. Silva Pág. 12 de 18TOTVS – ES 04/09/2010
  • Consultas SQL Server5 – TRABALHANDO COM PROCEDIMENTOSVocê pode criar procedimentos armazenados usando a instrução CREATE PROCEDURE Transact-SQL.Antes de criar um procedimento armazenado, considere que:  As instruções CREATE PROCEDURE não podem ser combinadas com outras instruções SQL em um único lote.  Para criar procedimentos, você deve ter a permissão CREATE PROCEDURE no banco de dados e a permissão ALTER no esquema no qual o procedimento está sendo criado. Para procedimentos armazenados CLR, você deve possuir assembly referenciado em <método_especificador> ou ter a permissão REFERENCES nesse assembly.  Os procedimentos armazenados são objetos no escopo do esquema e seus nomes devem seguir as regras para identificadores.  Você só pode criar um procedimento armazenado no banco de dados atual.Ao criar um procedimento armazenado, você deve especificar:  Qualquer parâmetro de entrada e saída para o procedimento de chamada ou lote.  As instruções de programação que executam operações no banco de dados, inclusive de chamada de outros procedimentos.  O valor de status retornado ao procedimento ou lote de chamada para indicar sucesso ou falha (e o motivo da falha).  Qualquer instrução de tratamento de erros necessária para detectar e tratar erros potenciais. As funções de tratamento de erros como ERROR_LINE e ERROR_PROCEDURE podem ser especificadas no procedimento armazenado. Para obter mais informações, consulte Usando TRY...CATCH em Transact-SQL. Nomeando procedimentos armazenadosRecomendamos que você não crie qualquer procedimento armazenado usando sp_ como umprefixo. SQL Server usa o prefixo sp_ para designar procedimentos armazenados do sistema. Onome escolhido pode estar em conflito com algum procedimento de sistema futuro. Se seu aplicativousar referências de nome qualificado fora do esquema e seu nome de procedimento conflitar comum nome de procedimento do sistema, seu aplicativo falhará, pois o nome será associado aoprocedimento do sistema, não ao seu.Um procedimento armazenado definido pelo usuário que possui o mesmo nome como umprocedimento armazenado do sistema que seja não qualificado ou estiver no esquema dbo nuncaserá executado; em vez disso será executado sempre o procedimento armazenado do sistema. Oexemplo a seguir demonstra esse comportamento.Exemplo:USE AdventureWorks;Desenvolvido por: Alexandre G. Silva Pág. 13 de 18TOTVS – ES 04/09/2010
  • Consultas SQL ServerGOCREATE PROCEDURE dbo.sp_whoAS SELECT FirstName, LastName FROM Person.Contact;GOEXEC sp_who;EXEC dbo.sp_who;GODROP PROCEDURE dbo.sp_who;GOUsar um qualificador de esquema explícito também proporciona uma pequena vantagem dedesempenho. A resolução de nome será ligeiramente mais rápida se o Mecanismo de Banco deDados não tiver que pesquisar vários esquemas para localizar o procedimento. Para obter maisinformações, consulte Executando um procedimento armazenado. Procedimentos armazenados temporáriosOs procedimentos armazenados temporários privativos e globais, de maneira análoga às tabelastemporárias, podem ser criados com os prefixos # e ## adicionados ao nome do procedimento. #denota um procedimento armazenado temporário local; ## denota um procedimento armazenadotemporário global. Esses procedimentos não existem após SQL Server ser desligado.Os procedimentos armazenados temporários são úteis na conexão com versões anteriores de SQLServer que não oferecem suporte ao reuso de plano de execução para instruções ou lotes Transact-SQL. Os aplicativos que se conectam ao SQL Server 2000 e versões posteriores devem usar oprocedimento armazenado do sistema sp_executesql em vez de procedimentos armazenadostemporários. Apenas a conexão que criou um procedimento temporário local poderá executá-lo e oprocedimento será automaticamente excluído quando a conexão for fechada.Qualquer conexão pode executar um procedimento armazenado temporário global. Umprocedimento armazenado temporário global existe até que a conexão usada pelo usuário que criouo procedimento seja fechada e qualquer versão do procedimento sendo executada por qualqueroutra conexão seja concluída. Depois que a conexão usada para criar o procedimento for fechada,nenhuma execução adicional do procedimento armazenado temporário global será permitida.Apenas a conclusão das conexões que já começaram a executar o procedimento armazenado serápermitida.Se um procedimento armazenado não precedido por # ou ## for criado diretamente no banco dedados tempdb, o procedimento armazenado será excluído automaticamente quando SQL Server fordesligado, pois tempdb será recriado cada vez em que SQL Server for iniciado. Os procedimentoscriados diretamente em tempdb existirão mesmo depois que a criação da conexão estiverterminada. Observação: O uso intenso de procedimentos armazenados temporários pode criar contenção nas tabelas do sistema em tempdb e afetar o desempenho adversamente. É recomendado usar sp_executesql. sp_executesql não armazena dados nas tabelas do sistema, evitando o problema.Os procedimentos armazenados CLR não podem ser criados como procedimentos armazenadostemporários.Desenvolvido por: Alexandre G. Silva Pág. 14 de 18TOTVS – ES 04/09/2010
  • Consultas SQL Server ExemplosA. Usando um procedimento simples com um SELECT complexoO procedimento armazenado a seguir retorna todos os funcionários (com os nomes e sobrenomesfornecidos), cargos e nomes de departamento em uma exibição. Esse procedimento armazenadonão usa nenhum parâmetro.Exemplo:USE AdventureWorks;GOIF OBJECT_ID ( HumanResources.uspGetAllEmployees, P ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetAllEmployees;GOCREATE PROCEDURE HumanResources.uspGetAllEmployeesAS SET NOCOUNT ON; SELECT LastName, FirstName, JobTitle, Department FROM HumanResources.vEmployeeDepartment;GOO procedimento armazenado uspGetEmployees pode ser executado das seguintes maneiras:Exemplo:EXECUTE HumanResources.uspGetAllEmployees;GO-- OrEXEC HumanResources.uspGetAllEmployees;GO-- Or, if this procedure is the first statement within a batch:HumanResources.uspGetAllEmployees;B. Usando um procedimento simples com parâmetrosO procedimento armazenado a seguir retorna somente o funcionário especificado (com nome esobrenome fornecidos), cargo e nome de departamento em uma exibição. Esse procedimentoarmazenado aceita correspondências exatas para os parâmetros passados.Exemplo:USE AdventureWorks;GOIF OBJECT_ID ( HumanResources.uspGetEmployees, P ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetEmployees;GOCREATE PROCEDURE HumanResources.uspGetEmployees @LastName nvarchar(50), @FirstName nvarchar(50)AS SET NOCOUNT ON; SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment WHERE FirstName = @FirstName AND LastName = @LastName;GODesenvolvido por: Alexandre G. Silva Pág. 15 de 18TOTVS – ES 04/09/2010
  • Consultas SQL ServerO procedimento armazenado uspGetEmployees pode ser executado das seguintes maneiras:Exemplo:EXECUTE HumanResources.uspGetEmployees NAckerman, NPilar;-- OrEXEC HumanResources.uspGetEmployees @LastName = NAckerman, @FirstName = NPilar;GO-- OrEXECUTE HumanResources.uspGetEmployees @FirstName = NPilar, @LastName = NAckerman;GO-- Or, if this procedure is the first statement within a batch:HumanResources.uspGetEmployees NAckerman, NPilar;C. Usando um procedimento simples com parâmetros de curingaO procedimento armazenado a seguir retorna somente os funcionários especificados (com os nomese sobrenomes fornecidos), cargos e departamentos em uma exibição. O padrão desse procedimentoarmazenado corresponde aos parâmetros passados ou, quando não fornecidos, usa o padrãopredefinido (sobrenomes que começam com a letra D).Exemplo:USE AdventureWorks;GOIF OBJECT_ID ( HumanResources.uspGetEmployees2, P ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetEmployees2;GOCREATE PROCEDURE HumanResources.uspGetEmployees2 @LastName nvarchar(50) = ND%, @FirstName nvarchar(50) = N%AS SET NOCOUNT ON; SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName;GOO procedimento armazenado uspGetEmployees2 pode ser executado em muitas combinações.Apenas algumas combinações são mostradas aqui:Exemplo:EXECUTE HumanResources.uspGetEmployees2;-- OrEXECUTE HumanResources.uspGetEmployees2 NWi%;-- OrEXECUTE HumanResources.uspGetEmployees2 @FirstName = N%;-- OrEXECUTE HumanResources.uspGetEmployees2 N[CK]ars[OE]n;-- OrEXECUTE HumanResources.uspGetEmployees2 NHesse, NStefen;-- OrEXECUTE HumanResources.uspGetEmployees2 NH%, NS%;Desenvolvido por: Alexandre G. Silva Pág. 16 de 18TOTVS – ES 04/09/2010
  • Consultas SQL ServerD. Usando parâmetros OUTPUTO exemplo a seguir cria o procedimento armazenado uspGetList, que retorna uma lista dos produtoscom preços que não excedem um valor especificado. O exemplo mostra o uso de várias instruçõesSELECT e vários parâmetros OUTPUT. Os parâmetros OUTPUT permitem que um procedimentoexterno, um lote ou mais de uma instrução Transact-SQL acessem um valor definido durante aexecução do procedimento.Exemplo:USE AdventureWorks;GOIF OBJECT_ID ( Production.uspGetList, P ) IS NOT NULL DROP PROCEDURE Production.uspGetList;GOCREATE PROCEDURE Production.uspGetList @Product varchar(40) , @MaxPrice money , @ComparePrice money OUTPUT , @ListPrice money OUTAS SET NOCOUNT ON; SELECT p.[Name] AS Product, p.ListPrice AS List Price FROM Production.Product AS p JOIN Production.ProductSubcategory AS s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;-- Populate the output variable @ListPprice.SET @ListPrice = (SELECT MAX(p.ListPrice) FROM Production.Product AS p JOIN Production.ProductSubcategory AS s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);-- Populate the output variable @compareprice.SET @ComparePrice = @MaxPrice;GOExecute uspGetList para retornar uma lista de produtos (bicicletas) da Adventure Works que custammenos que $ 700. Os parâmetros OUTPUT @Cost e @ComparePrices são usados com linguagemde controle de fluxo para retornar uma mensagem na janela Mensagens. Observação: A variável OUTPUT deve ser definida durante a criação do procedimento como também durante o uso da variável. O nome do parâmetro e da variável não precisam ser correspondentes; entretanto, o tipo de dados e o posicionamento do parâmetro devem corresponder (a menos que @ListPrice = variable seja usado).Exemplo:DECLARE @ComparePrice money, @Cost moneyEXECUTE Production.uspGetList %Bikes%, 700, @ComparePrice OUT,Desenvolvido por: Alexandre G. Silva Pág. 17 de 18TOTVS – ES 04/09/2010
  • Consultas SQL Server @Cost OUTPUTIF @Cost <= @ComparePriceBEGIN PRINT These products can be purchased for less than $+RTRIM(CAST(@ComparePrice AS varchar(20)))+.ENDELSE PRINT The prices for all products in this category exceed $+ RTRIM(CAST(@ComparePrice AS varchar(20)))+.Eis o conjunto parcial dos resultados:Exemplo:Product List Price-------------------------------------------------- ------------------Road-750 Black, 58 539.99Mountain-500 Silver, 40 564.99Mountain-500 Silver, 42 564.99...Road-750 Black, 48 539.99Road-750 Black, 52 539.99(14 row(s) affected)These items can be purchased for less than $700.00.Fonte: http://technet.microsoft.com/en-us/library/ms190669(SQL.100).aspxDesenvolvido por: Alexandre G. Silva Pág. 18 de 18TOTVS – ES 04/09/2010