Sei sulla pagina 1di 18

Consultas SQL Server

1 - MANIPULAO 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 expresses separadas por vrgulas. Cada expresso define o formato (tipo de dados e tamanho) e a fonte dos dados para a coluna do conjunto de resultados. Cada expresso de lista de seleo tipicamente uma referncia a uma coluna na tabela de origem ou exibio de onde os dados provm, mas pode ser qualquer outra expresso, como uma constante ou uma funo Transact-SQL. O uso da expresso * em uma lista de seleo especifica que todas as colunas da tabela de origem so 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 Contm uma lista das tabelas das quais os dados do conjunto de resultados so recuperados. Essas fontes podem ser: Tabelas base no servidor local que executa o SQL Server. Exibies na instncia local do SQL Server. O SQL Server resolve internamente uma referncia de exibio para referncias nas tabelas base que compem a exibio. Tabelas vinculadas. So tabelas em fontes de dados OLE DB que podem ser acessadas pelo SQL Server. Isso referido como consulta distribuda. Fontes de dados OLE DB podem ser acessadas no SQL Server vinculando-as como servidor vinculado ou referenciando a fonte de dados em uma funo OPENROWSET ou OPENQUERY. A clusula FROM tambm pode conter especificaes de juno. Isso define o caminho especfico que o SQL Server dever usar para navegar de uma tabela para outra. A clusula FROM tambm usada nas instrues DELETE e UPDATE para definir as tabelas que so modificadas. WHERE search_conditions A clusula WHERE um filtro que define as condies que cada linha das tabelas de origem deve atender para qualificar-se para a clusula SELECT. Apenas linhas que atendem s condies colaboram com dados para o conjunto de resultados. Dados de linhas que no atendem s condies no so usados.

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 1 de 18 04/09/2010

Consultas SQL Server


A clusula WHERE tambm usada nas instrues DELETE e UPDATE para definir as linhas nas tabelas de destino que so modificadas. GROUP BY group_by_list A clusula 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 clusula GROUP BY TerritoryID divide o conjunto de resultados em 10 grupos, um para cada valor de TerritoryID. HAVING search_conditions A clusula HAVING um filtro adicional que aplicado ao conjunto de resultados. Logicamente, a clusula HAVING filtra linhas do conjunto de resultados intermedirio construdo com a aplicao de quaisquer clusulas FROM, WHERE ou GROUP BY na instruo SELECT. As clusulas HAVING so tipicamente usadas com uma clusula GROUP BY, embora uma clusula GROUP BY no seja necessria antes de uma clusula HAVING. ORDER BY order_list[ ASC | DESC ] A clusula ORDER BY define a ordem na qual so classificadas as linhas no conjunto de resultados. order_list especifica as colunas do conjunto de resultados que compem a lista de classificao. As palavras-chaves ASC e DESC so usadas para especificar se as linhas so classificadas em seqncia ascendente ou descendente. ORDER BY importante porque a teoria relacional especifica que no se pode pressupor que as linhas de um conjunto de resultados tenham qualquer seqncia, a menos que ORDER BY seja especificado. ORDER BY deve ser usado em qualquer instruo SELECT para a qual a ordem das linhas do conjunto de resultados seja importante. As clusulas de uma declarao SELECT devem ser especificadas na ordem adequada. Cada referncia a um objeto do banco de dados deve ser inequvoca. A ambigidade pode vir das seguintes fontes: Pode haver vrios objetos que tm o mesmo nome em um sistema. Por exemplo, Schema1 e Schema2 podem ter uma tabela nomeada TableX. Para resolver a ambigidade e especificar o objeto TableX possudo 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 instruo SELECT executada. Para ter certeza de que o objeto correto sempre usado, independentemente da configurao 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 TOTVS ES Pg. 2 de 18 04/09/2010

Consultas SQL Server


As tabelas e exibies especificadas na clusula FROM podem ter nomes de coluna duplicados. Freqentemente, chaves estrangeiras tero o mesmo nome de coluna que sua chave primria relacionada. Para resolver a ambigidade entre nomes duplicados, o nome de coluna deve ser qualificado com o nome da tabela ou nome de exibio: 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 exibio tiverem que ser qualificados completamente. Voc pode resolver esse problema atribuindo um nome de correlao, tambm conhecido como uma varivel de intervalo ou alias, tabela, usando a palavra-chave AS na clusula FROM. O nome de tabela ou de exibio completamente qualificado tem de ser especificado apenas na clusula FROM. Todas as outras referncias a tabelas ou exibies podem ento usar o nome de correlao. Aplicar nomes de correlao e qualificar as tabelas completamente na amostra anterior cria esta instruo 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 informaes sobre qualificao de objeto, consulte Identificadores. Nos Manuais Online do SQL Server, muitos exemplos de Transact-SQL esto simplificados por no se usarem nomes qualificados. Embora esses elementos no estejam includos nos exemplos, a fim de facilitar a legibilidade, recomendamos que voc use nomes qualificados em instrues Transact-SQL em sistemas de produo.

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 3 de 18 04/09/2010

Consultas SQL Server


Funes de agregao. FUNO MIN() MAX() AVG() SUM() COUNT() DESCRIO Menor valor do conjunto de valores passados como parmetro. Maior valor do conjunto de valores passados como parmetro. Mdia normal do conjunto de valores passados como parmetro. Soma do conjunto de valores passados como parmetro. Contador do tipo de valores passados como parmetro.

Operadores lgicos. OPERADOR = <> > < >= <= !> !< != Igualdade Desigualdade Maior que Menor que Maior ou igual a Menor ou igual a No maoir que No menor que No igual DESCRIO

Fonte de pesquisa: http://go.microsoft.com/fwlink/?LinkID=127251

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 4 de 18 04/09/2010

Consultas SQL Server


2 - TRABALHANDO COM MLTIPLAS TABELAS As condies de juno podem ser especificadas nas clusulas FROM ou WHERE, sendo recomendado que sejam especificadas na clusula FROM. As clusulas WHERE e HAVING tambm podem conter critrios de pesquisa para filtrar ainda mais as linhas selecionadas pelas condies de juno. As junes podem ser categorizadas como: Junes internas (a operao de juno tpica como a que usa algum operador de comparao como = ou <>). Esses incluem junes naturais e junes por igualdade. As junes internas usam um operador de comparao para relacionar duas tabelas com base nos valores em colunas comuns de cada tabela. Por exemplo, ao recuperar todas as linhas em que o nmero de identificao do aluno o mesmo em ambas as tabelas alunos e cursos. Junes externas. As junes externas pode ser uma juno externa esquerda, direita ou juno externa completa. As junes externas so especificadas com um dos seguintes conjuntos de palavras-chave quando elas so especificadas na clusula FROM: LEFT JOIN ou LEFT OUTER JOIN O conjunto de resultados de uma juno externa inclui todas as linhas de uma tabela esquerda especificadas na clusula LEFT OUTER, no somente aquelas nas quais as colunas unidas se correspondem. Quando uma linha na tabela esquerda no possui linhas correspondentes na tabela direita, a linha associada ao conjunto de resultados conter valores nulos para todas as colunas da lista de seleo vindos da tabela direita. RIGHT JOIN ou RIGHT OUTER JOIN Uma juno externa direita o oposto de uma juno externa esquerda. So retornadas todas as linhas da tabela direita. So retornados valores nulos para a tabela esquerda sempre que uma tabela direita no possuir alguma linha de correspondncia na tabela esquerda. FULL JOIN ou FULL OUTER JOIN Uma juno externa completa retorna todas as linhas em ambas as tabelas direita e esquerda. Sempre que uma linha no tiver correspondncia com a outra tabela, as colunas da lista de seleo da outra tabela contero valores nulos. Quando houver correspondncia entre as tabelas, todas as linhas do conjunto de resultados contero valores de dados de tabelas base. CROSS JOIN Uma juno cruzada sem uma clusula WHERE produz o produto cartesiano das tabelas envolvidas na juno. O tamanho do conjunto de resultados do produto cartesiano o nmero de linhas na primeira tabela multiplicado pelo nmero de linhas na segunda tabela. O exemplo a seguir mostra juno cruzada Transact-SQL.

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 5 de 18 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 contm 170 linhas (SalesPerson tem 17 linhas e SalesTerritory tem 10; 17 multiplicado por 10 igual a 170). Porm, se uma clusula WHERE for adicionada, a juno cruzada se comportar como uma juno 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 TOTVS ES

Pg. 6 de 18 04/09/2010

Consultas SQL Server


3 - EXERCCIOS 1 - Selecione os nomes, em ordem alfabtica, de todos os funcionrios da Matriz (filial 1), bem como o cdigo da filial. 2 - Selecione o cdigo do tipo de movimento, o nome, o valor bruto, numero do movimento e data de emisso. 3 - Selecione a quantidade de ordem de compras agrupando pelo ms de emisso. 4 - Selecione a soma dos lanamentos financeiros a receber que esto em aberto agrupados por fornecedor. 5 - Faa uma listagem de produtos contendo o cdigo do produto, nome, unidade de controle, unidade de venda, unidade de compra de todos os produtos da tabela de produtos. Ordenar os produtos por cdigo.

6 Listagem de produtos que foram movimentados no ms de abril de 2005 no movimento de ordem de compras, trazer o cdigo do produto, nome fantasia, numero do movimento, data de emisso e valor liquido.

7 Liste os produtos que tiveram ordem de compra cujo o valor total do item seja maior que 1000(mil), trazer como informao: numero do movimento, numero de sequncia, cdigo do produto, valor total.

8 listar todas as ordens de compra que no estiverem canceladas e foram emitidas no ms de fevereiro de 2006, trazendo o numero da ordem de compra, o valor bruto, valor liquido, subtotal.

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 7 de 18 04/09/2010

Consultas SQL Server


4 TRABALHANDO COM FUNES

Funes escalares As funes escalares definidas pelo usurio retornam um nico valor de dados do tipo definido na clusula RETURNS. Para uma funo escalar embutida, no h nenhum corpo de funo; o valor escalar o resultado de uma nica instruo. Para uma funo escalar com vrias instrues, o corpo da funo, definido em um bloco BEGINEND, contm uma srie de instrues do Transact SQL que retornam o valor nico. O tipo de retorno pode ser em qualquer tipo de dados, exceto texto, ntext, imagem, cursor e carimbo de data/hora. Funes com valor de tabela As funes com valor de tabela definidas pelo usurio retornam um tipo de dados de tabela. Para uma funo com valor de tabela embutida, no h corpo de funo; a tabela o conjunto de resultados de uma nica instruo SELECT. Para uma funo com valor de tabela com vrias instrues, o corpo de funo, definido em um bloco BEGIN... END, contm uma srie de instrues do Transact-SQL que criam e inserem linhas na tabela que ser retornada. Funes internas As funes internas so fornecidas pelo SQL Server para ajudar voc a executar uma variedade de operaes. Elas no podem ser modificadas. Voc pode usar funes internas em instrues do Transact-SQL para: Acessar informaes de tabelas do sistema SQL Server sem acessar os tabelas do sistema diretamente. Executar tarefas comuns como SUM, GETDATE ou IDENTITY.

Funes internas retornam os tipos de dados escalar ou de tabela. Por exemplo, @@ERROR retorna 0 se a ltima instruo do Transact-SQL tiver sido executada com xito. Se a instruo gerou um erro, @@ERROR retorna o nmero do erro. E a funo SUM(parameter) retorna a soma de todos os valores do parmetro. Abaixo uma tabela contendo algumas funes internas que podem ser bastante teis Funo APP_NAME Expresso CASE CAST e CONVERT Descrio Retorna o nome do aplicativo para a sesso atual se definido pelo aplicativo Avalia uma lista de condies e retorna uma das vrias expresses de resultado possveis. Converte uma expresso de um tipo de dados para outro.

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 8 de 18 04/09/2010

Consultas SQL Server


COALESCE COLLATIONPROPERTY Retorna a primeira expresso no nula entre seus argumentos. Retorna a propriedade do agrupamento especificado. Retorna um padro de bit varbinary que indica as colunas de uma tabela ou exibio que foram inseridas ou atualizadas. Retorna o carimbo de data e hora do sistema do banco de dados atual como um valor datetime sem o deslocamento de fuso horrio do banco de dados. Retorna o nome do usurio atual. Retorna o nmero de bytes usado para representar qualquer expresso. bem similar a funo LEN()

COLUMNS_UPDATED

CURRENT_TIMESTAMP

CURRENT_USER

DATALENGTH

Funes escalares

As funes escalares definidas pelo usurio retornam um valor nico de dados do tipo definido na clusula RETURNS. Para uma funo escalar embutida, no h um corpo de funo; o valor escalar o resultado de uma nica instruo. Para uma funo escalar de vrias instrues, o corpo da funo, definido em um bloco BEGIN...END, contm uma srie de instrues Transact-SQL, que retornam 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 funo escalar de vrias instrues. A funo pega um valor de entrada, um ProductID, e retorna um nico valor de dados, a quantidade agregada do produto especificado no inventrio. Exemplo: USE AdventureWorks2008R2; GO IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') IS NOT NULL DROP FUNCTION ufnGetInventoryStock; GO CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int) RETURNS int AS -- 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 TOTVS ES Pg. 9 de 18 04/09/2010

Consultas SQL Server


SET @ret = 0; RETURN @ret; END; GO

O exemplo a seguir usa a funo ufnGetInventoryStock, para retornar a quantidade atual do inventrio dos produtos que tm um ProductModelIDentre 75 e 80. Exemplo: USE AdventureWorks2008R2; GO SELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS CurrentSupply FROM Production.Product WHERE ProductModelID BETWEEN 75 and 80; GO Funes com valor de tabela

As funes com valor de tabela definidas pelo usurio retornam um tipo de dados table. Para uma funo com valor de tabela embutida, no h um corpo de funo; a tabela o conjunto de resultados de uma nica instruo SELECT. O exemplo a seguir cria uma funo com valor de tabela embutida. A funo pega um parmetro de entrada, um ID cliente (loja), e retorna as colunas ProductID, Name e a agregao das vendas do ano, at a data atual, como YTD Total para cada produto vendido para a loja. Exemplo: USE AdventureWorks2008R2; GO IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL DROP FUNCTION Sales.ufn_SalesByStore; GO CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int) RETURNS TABLE AS RETURN ( 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 ); GO

O exemplo a seguir invoca a funo e especifica a ID do cliente 602.


Desenvolvido por: Alexandre G. Silva TOTVS ES Pg. 10 de 18 04/09/2010

Consultas SQL Server


Exemplo: SELECT * FROM Sales.ufn_SalesByStore (602);

Para uma funo com valor de tabela de vrias instrues, o corpo da funo definido em um bloco BEGIN...END contm uma srie de instrues Transact-SQL, que criam e inserem linhas na tabela que ser retornada. O exemplo a seguir cria uma funo com valor de tabela. A funo toma um nico parmetro de entrada, um EmployeeID e retorna uma lista de todos os funcionrios que reportam direta ou indiretamente ao funcionrio especificado. A funo que especifica a ID do funcionrio 109 invocada em seguida. Exemplo: USE AdventureWorks2008R2; GO IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL DROP FUNCTION dbo.ufn_FindReports; GO CREATE 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.*/ AS BEGIN WITH 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 -- Get the 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 @retFindReports
Desenvolvido por: Alexandre G. Silva TOTVS ES Pg. 11 de 18 04/09/2010

Consultas SQL Server


SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel FROM EMP_cte RETURN END; GO -- Example invocation SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel FROM dbo.ufn_FindReports(1); GO Fonte: http://msdn.microsoft.com/en-us/library/ms177499.aspx

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 12 de 18 04/09/2010

Consultas SQL Server


5 TRABALHANDO COM PROCEDIMENTOS Voc pode criar procedimentos armazenados usando a instruo CREATE PROCEDURE Transact-SQL. Antes de criar um procedimento armazenado, considere que: As instrues CREATE PROCEDURE no podem ser combinadas com outras instrues SQL em um nico lote. Para criar procedimentos, voc deve ter a permisso CREATE PROCEDURE no banco de dados e a permisso ALTER no esquema no qual o procedimento est sendo criado. Para procedimentos armazenados CLR, voc deve possuir assembly referenciado em <mtodo_especificador> ou ter a permisso REFERENCES nesse assembly. Os procedimentos armazenados so 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 parmetro de entrada e sada para o procedimento de chamada ou lote. As instrues de programao que executam operaes 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 instruo de tratamento de erros necessria para detectar e tratar erros potenciais. As funes de tratamento de erros como ERROR_LINE e ERROR_PROCEDURE podem ser especificadas no procedimento armazenado. Para obter mais informaes, consulte Usando TRY...CATCH em Transact-SQL. Nomeando procedimentos armazenados Recomendamos que voc no crie qualquer procedimento armazenado usando sp_ como um prefixo. SQL Server usa o prefixo sp_ para designar procedimentos armazenados do sistema. O nome escolhido pode estar em conflito com algum procedimento de sistema futuro. Se seu aplicativo usar referncias de nome qualificado fora do esquema e seu nome de procedimento conflitar com um nome de procedimento do sistema, seu aplicativo falhar, pois o nome ser associado ao procedimento do sistema, no ao seu. Um procedimento armazenado definido pelo usurio que possui o mesmo nome como um procedimento armazenado do sistema que seja no qualificado ou estiver no esquema dbo nunca ser executado; em vez disso ser executado sempre o procedimento armazenado do sistema. O exemplo a seguir demonstra esse comportamento.

Exemplo: USE AdventureWorks;

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 13 de 18 04/09/2010

Consultas SQL Server


GO CREATE PROCEDURE dbo.sp_who AS SELECT FirstName, LastName FROM Person.Contact; GO EXEC sp_who; EXEC dbo.sp_who; GO DROP PROCEDURE dbo.sp_who; GO Usar um qualificador de esquema explcito tambm proporciona uma pequena vantagem de desempenho. A resoluo de nome ser ligeiramente mais rpida se o Mecanismo de Banco de Dados no tiver que pesquisar vrios esquemas para localizar o procedimento. Para obter mais informaes, consulte Executando um procedimento armazenado. Procedimentos armazenados temporrios Os procedimentos armazenados temporrios privativos e globais, de maneira anloga s tabelas temporrias, podem ser criados com os prefixos # e ## adicionados ao nome do procedimento. # denota um procedimento armazenado temporrio local; ## denota um procedimento armazenado temporrio global. Esses procedimentos no existem aps SQL Server ser desligado. Os procedimentos armazenados temporrios so teis na conexo com verses anteriores de SQL Server que no oferecem suporte ao reuso de plano de execuo para instrues ou lotes TransactSQL. Os aplicativos que se conectam ao SQL Server 2000 e verses posteriores devem usar o procedimento armazenado do sistema sp_executesql em vez de procedimentos armazenados temporrios. Apenas a conexo que criou um procedimento temporrio local poder execut-lo e o procedimento ser automaticamente excludo quando a conexo for fechada. Qualquer conexo pode executar um procedimento armazenado temporrio global. Um procedimento armazenado temporrio global existe at que a conexo usada pelo usurio que criou o procedimento seja fechada e qualquer verso do procedimento sendo executada por qualquer outra conexo seja concluda. Depois que a conexo usada para criar o procedimento for fechada, nenhuma execuo adicional do procedimento armazenado temporrio global ser permitida. Apenas a concluso das conexes que j comearam a executar o procedimento armazenado ser permitida. Se um procedimento armazenado no precedido por # ou ## for criado diretamente no banco de dados tempdb, o procedimento armazenado ser excludo automaticamente quando SQL Server for desligado, pois tempdb ser recriado cada vez em que SQL Server for iniciado. Os procedimentos criados diretamente em tempdb existiro mesmo depois que a criao da conexo estiver terminada. Observao: O uso intenso de procedimentos armazenados temporrios pode criar conteno nas tabelas do sistema em tempdb e afetar o desempenho adversamente. recomendado usar sp_executesql. sp_executesql no armazena dados nas tabelas do sistema, evitando o problema. Os procedimentos armazenados CLR no podem ser criados como procedimentos armazenados temporrios.

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 14 de 18 04/09/2010

Consultas SQL Server


Exemplos A. Usando um procedimento simples com um SELECT complexo O procedimento armazenado a seguir retorna todos os funcionrios (com os nomes e sobrenomes fornecidos), cargos e nomes de departamento em uma exibio. Esse procedimento armazenado no usa nenhum parmetro. Exemplo: USE AdventureWorks; GO IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetAllEmployees; GO CREATE PROCEDURE HumanResources.uspGetAllEmployees AS SET NOCOUNT ON; SELECT LastName, FirstName, JobTitle, Department FROM HumanResources.vEmployeeDepartment; GO O procedimento armazenado uspGetEmployees pode ser executado das seguintes maneiras: Exemplo: EXECUTE HumanResources.uspGetAllEmployees; GO -- Or EXEC HumanResources.uspGetAllEmployees; GO -- Or, if this procedure is the first statement within a batch: HumanResources.uspGetAllEmployees; B. Usando um procedimento simples com parmetros O procedimento armazenado a seguir retorna somente o funcionrio especificado (com nome e sobrenome fornecidos), cargo e nome de departamento em uma exibio. Esse procedimento armazenado aceita correspondncias exatas para os parmetros passados. Exemplo: USE AdventureWorks; GO IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetEmployees; GO CREATE 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; GO
Desenvolvido por: Alexandre G. Silva TOTVS ES Pg. 15 de 18 04/09/2010

Consultas SQL Server


O procedimento armazenado uspGetEmployees pode ser executado das seguintes maneiras: Exemplo: EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar'; -- Or EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName = N'Pilar'; GO -- Or EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman'; GO -- Or, if this procedure is the first statement within a batch: HumanResources.uspGetEmployees N'Ackerman', N'Pilar'; C. Usando um procedimento simples com parmetros de curinga O procedimento armazenado a seguir retorna somente os funcionrios especificados (com os nomes e sobrenomes fornecidos), cargos e departamentos em uma exibio. O padro desse procedimento armazenado corresponde aos parmetros passados ou, quando no fornecidos, usa o padro predefinido (sobrenomes que comeam com a letra D). Exemplo: USE AdventureWorks; GO IF OBJECT_ID ( 'HumanResources.uspGetEmployees2', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetEmployees2; GO CREATE PROCEDURE HumanResources.uspGetEmployees2 @LastName nvarchar(50) = N'D%', @FirstName nvarchar(50) = N'%' AS SET NOCOUNT ON; SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName; GO O procedimento armazenado uspGetEmployees2 pode ser executado em muitas combinaes. Apenas algumas combinaes so mostradas aqui: Exemplo: EXECUTE -- Or EXECUTE -- Or EXECUTE -- Or EXECUTE -- Or EXECUTE -- Or EXECUTE HumanResources.uspGetEmployees2; HumanResources.uspGetEmployees2 N'Wi%'; HumanResources.uspGetEmployees2 @FirstName = N'%'; HumanResources.uspGetEmployees2 N'[CK]ars[OE]n'; HumanResources.uspGetEmployees2 N'Hesse', N'Stefen'; HumanResources.uspGetEmployees2 N'H%', N'S%';

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 16 de 18 04/09/2010

Consultas SQL Server


D. Usando parmetros OUTPUT O exemplo a seguir cria o procedimento armazenado uspGetList, que retorna uma lista dos produtos com preos que no excedem um valor especificado. O exemplo mostra o uso de vrias instrues SELECT e vrios parmetros OUTPUT. Os parmetros OUTPUT permitem que um procedimento externo, um lote ou mais de uma instruo Transact-SQL acessem um valor definido durante a execuo do procedimento. Exemplo: USE AdventureWorks; GO IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL DROP PROCEDURE Production.uspGetList; GO CREATE PROCEDURE Production.uspGetList @Product varchar(40) , @MaxPrice money , @ComparePrice money OUTPUT , @ListPrice money OUT AS 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; GO Execute uspGetList para retornar uma lista de produtos (bicicletas) da Adventure Works que custam menos que $ 700. Os parmetros OUTPUT @Cost e @ComparePrices so usados com linguagem de controle de fluxo para retornar uma mensagem na janela Mensagens. Observao: A varivel OUTPUT deve ser definida durante a criao do procedimento como tambm durante o uso da varivel. O nome do parmetro e da varivel no precisam ser correspondentes; entretanto, o tipo de dados e o posicionamento do parmetro devem corresponder (a menos que @ListPrice = variable seja usado).

Exemplo: DECLARE @ComparePrice money, @Cost money EXECUTE Production.uspGetList '%Bikes%', 700, @ComparePrice OUT,
Desenvolvido por: Alexandre G. Silva TOTVS ES Pg. 17 de 18 04/09/2010

Consultas SQL Server


@Cost OUTPUT IF @Cost <= @ComparePrice BEGIN PRINT 'These products can be purchased for less than $'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.' END ELSE 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.99 Mountain-500 Silver, 40 564.99 Mountain-500 Silver, 42 564.99 ... Road-750 Black, 48 539.99 Road-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).aspx

Desenvolvido por: Alexandre G. Silva TOTVS ES

Pg. 18 de 18 04/09/2010

Potrebbero piacerti anche