Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пак Новакова + / LabSQL3(6-11)ЯрославцеваСоловьёв.doc
Скачиваний:
53
Добавлен:
03.06.2014
Размер:
1.52 Mб
Скачать

Упражнение 2 - Создание функции, возвращающей табличное значение (I-l t-V udf)

  1. Создание функции, возвращающей табличное значение (In-LineTable-valuedUDF). Создадим функциюSales.GetDiscountForDate, которая находит те же столбцы, что и хранимая процедураGetDiscounts(лаб.8). У функции должен быть входной параметр @DateToCheckdatetime. Он должен использовать использоваться для фильтрации скидок на основе введенной даты. Это позволяет компанииAdventureWorksпроверить, какие скидки будут доступны на указанную дату.

CREATE FUNCTION Sales.GetDiscountForDate (@DateToCheck datetime)

RETURNS TABLE

AS

RETURN

select Description, DiscountPct, Type, Category, StartDate, EndDate, MinQty, MaxQty

from Sales.SpecialOffer

WHERE @DateToCheck Between StartDate AND EndDate

Рис. 3

  1. Для проверки функции введём следующую команду:

SELECT*

FROM Sales.GetDiscountForDate(GETDATE())

ORDER BY DiscountPct DESC

Рис.4. Проверка функции

Выданный результат показывает, что команда запроса выполнена корректно.

Упражнение 3 - Контроль контекста выполнения

Откройте и выполните файл ExecutionContext.sql

  1. Создание скалярной функции

  1. Создадим скалярную функцию GetCurrencyRateв схемеSales, которая находит последнюю ставку конвертации валюты для указанной валюты.

CREATE FUNCTION Sales.GetCurrencyRate

(

@CurrencyCode nchar(3)

)

RETURNS float

AS

BEGIN

DECLARE @CurrencyRate float

SELECT

@CurrencyRate = (SELECT TOP (1) EndOfDayRate

FROM AdventureWorksDW.dbo.DimCurrency C

INNER JOIN AdventureWorksDW.dbo.FactCurrencyRate CR

ON C.CurrencyKey = CR.CurrencyKey

WHERE C.CurrencyAlternateKey = @CurrencyCode

ORDER BY CR.TimeKey DESC)

IF (@CurrencyRate IS NULL)

SET @CurrencyRate = 1.0

RETURN @CurrencyRate

END

Рис. 5

  1. Для проверки функции введём следующую команду:

Select Sales.GetCurrencyRate('GBP')

Рис. 6. Результат работы

  1. Установление отношений доверия между базами данных

Чтобы функция GetCurrencyRate могла искать сведения о валюте, необходимо установить отношения доверия между базами данных AdventureWorks и AdventureWorksDW.

Выполняем следующие команды:

  1. Создание учетной записи пользователя в БД AdventureWorksDW:

USE AdventureWorksDW

IF NOT EXIST (SELECT* FROM sys.database_principals WHERE name='Adam' AND type='U')

CREATE USER Adam FOR LOGIN [MIAMI\Adam]

Рис. 7

  1. Предоставление разрешения AUTHENTICATE для пользователя в БД AdventureWorksDW:

GRANT AUTHENTICATE TO Adam

Рис. 8 разрешениеAUTHENTICATE

  1. Предоставление разрешения SELECTпользователюAdam:

GRANT SELECT TO Adam

Рис 9.Разрешение SELECT

  1. Установка параметра базы данных TRUSTWORTHYдля БДAdventureWorks.

Рис 10. Установка параметра TRUSTWORTHY

  1. Создание и тестирование функции GetCurrencyDiscountedProducts

  1. Создадим функцию GetCurrencyDiscountedProducts в схеме Sales, возвращающую табличное значение. Эта функция аналогична по функциональности функции GetDiscountedProducts, но включает цену и цену со скидкой в альтернативной валюте. Для указания валюты применяется входной параметр @CurrencyCode nchar(3).

Возвращаемая таблица должна содержать следующее определение:

Название столбца

Тип данных

ProductID

int

Name

nvarchar(50)

ListPrice

money

CurrencyPrice

money

DiscountDescription

Nvarchar(255)

DiscountPercentage

smallmoney

DiscountAmount

money

DiscountedPrice

Money

DiscountedCurrencyPrice

Money

CREATE FUNCTION Sales.GetCurrencyDiscountedProducts2

(@CurrencyCode nchar(3))

RETURNS @tbl_products TABLE

(ProductID int,

Name nvarchar(50),

ListPrice money,

CurrencyPrice money,

DiscountDescription nvarchar(255),

DiscountPercentage smallmoney,

DiscountAmount money,

DiscountedPrice money,

DiscountedCurrencyPrice money)

AS

BEGIN

DECLARE @CurrencyRate float

SET @CurrencyRate = Sales.GetCurrencyRate(@CurrencyCode)

INSERT @tbl_products

SELECT P.ProductID,

P.Name,

P.ListPrice,

P.ListPrice * @CurrencyRate,

SO.Description,

SO.DiscountPct,

P.ListPrice * SO.DiscountPct,

P.ListPrice - P.ListPrice * SO.DiscountPct,

(P.ListPrice - P.ListPrice * SO.DiscountPct) * @CurrencyRate

FROM Sales.SpecialOfferProduct SOP INNER JOIN

Sales.SpecialOffer SO ON SOP.SpecialOfferID = SO.SpecialOfferID INNER JOIN

Production.Product P ON SOP.ProductID = P.ProductID

WHERE (SO.DiscountPct > 0) AND GetDate() BETWEEN StartDate AND EndDate

ORDER BY ProductID

RETURN

END

GO

Данный запрос в среде выглядит так:

Рис. 11

  1. Для проверки функции введём следующую команду:

SELECT *

FROM Sales.GetCurrencyDiscountedProducts ('GBP')

Рис. 12. Проверка функции

Вывод: В ходе лабораторной работы мы изучены основные особенности создания и использования определяемых пользователем функции. Были созданы различные функции, возвращающие табличные и скалярные значения. Также научились устанавливать отношения между БД (т.е. предоставлять разрешения).