Хранимые процедуры в AdventureWorks
Образец базы данных OLTP AdventureWorks содержит несколько хранимых процедур Transact-SQL. Образцы хранимых процедур среды CLR можно загрузить с домашней страницы Microsoft SQL Server Samples and Community Projects (образцы кода и проекты сообщества Microsoft SQL Server).
Хранимые процедуры CLR
В следующей таблице содержится список образцов доступных хранимых процедур CLR. Дополнительные сведения об использовании хранимых процедур CLR см. в разделе Хранимые процедуры CLR.
Образец |
Описание |
---|---|
AdventureWorks Cycles CLR Layer |
Хранимая процедура на языке C#, которая на входе получает данные xml и вставляет их в столбцы таблицы Person.Contact. |
Хранимые процедуры Transact-SQL
В следующей таблице содержится список хранимых процедур Transact-SQL, которые содержатся в образце базы данных OLTP AdventureWorks. Дополнительные сведения о хранимых процедурах Transact-SQL см. в разделе Основные сведения о хранимых процедурах.
Хранимая процедура |
Описание |
Входные параметры |
---|---|---|
dbo.uspGetBillOfMaterials |
Использует рекурсивный запрос (обобщенное табличное выражение), чтобы сформировать многоуровневую ведомость материалов: все компоненты уровня 1 сборки 0, все компоненты уровня 2 сборки 1 и так далее. |
@StartProductIDint @CheckDatedatetime |
dbo.uspGetEmployeeManagers |
Использует рекурсивный запрос (обобщенное табличное выражение) для возврата прямых и косвенных менеджеров указанного служащего. |
@EmployeeIDint |
dbo.uspGetManagerEmployees |
Использует рекурсивный запрос (обобщенное табличное выражение) для возврата прямых и косвенных служащих указанного менеджера. |
@ManagerIDint |
dbo.uspLogError |
Записывает в таблицу dbo.ErrorLog сведения об ошибке, которая вызвала переход на блок CATCH конструкции TRY...CATCH. Эта процедура должна выполняться в области блока CATCH, иначе возврат будет произведен без сведений об ошибке. |
@ErrorLogIDint = 0 OUTPUT |
dbo.uspPrintError |
Выводит на печать сведения об ошибке, которая вызвала переход на блок CATCH конструкции TRY...CATCH. Эта процедура должна выполняться в области блока CATCH, иначе возврат не будет содержать сведений об ошибке, выводимых на печать. |
Нет |
dbo.uspGetWhereUsedProductID |
Использует рекурсивный запрос (обобщенное табличное выражение), чтобы возвратить все сборки продукта, которые используют указанный компонент продукта. Например, возвращает все велосипеды, в которых используется определенный тип колеса или краски. |
@StartProductIDint @CheckDatedatetime |
uspUpdateEmployeeHireInfo |
Обновляет таблицу Employee и производит вставку в таблицу новой строки EmployeePayHistory со значениями, указанными во входных параметрах. |
@EmployeeIDint @Titlenvarchar(50) @HireDatedatetime @RateChangeDatedatetime @Ratemoney @PayFrequencytinyint @CurrentFlagdbo.Flag |
uspUpdateEmployeeLogin |
Обновляет таблицу Employee значениями, переданными во входных параметрах, для указанного значения EmployeeID. |
@EmployeeID int @ManagerIDint @LoginIDnvarchar(256) @Titlenvarchar(50) @HireDatedatetime @CurrentFlagdbo.Flag |
uspUpdateEmployeePersonalInfo |
Обновляет таблицу Employee значениями, переданными во входных параметрах, для указанного значения EmployeeID. |
@EmployeeID int @NationalIDNumbernvarchar(15) @BirthDatedatetime @MaritalStatusnchar(1) @Gendernchar(1) |
Примеры
A. Использование dbo.uspGetBillOfMaterials
В следующем примере выполняется хранимая процедура uspgetBillOfMaterials. Процедура возвращает иерархический список компонентов, используемых в производстве велосипеда Road-550-W Yellow, 44 (ProductID800).
USE AdventureWorks;
GO
DECLARE @CheckDate DATETIME;
SET @CheckDate = GETDATE();
EXEC [AdventureWorks].[dbo].[uspGetBillOfMaterials] 800, @CheckDate;
Б. Использование dbo.uspGetEmployeeManagers
В следующем примере выполняется хранимая процедура uspGetEmployeeManagers. Процедура возвращает иерархический список прямых и косвенных менеджеров для EmployeeID 50.
USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 50;
В. Использование dbo.uspGetManagerEmployees
В следующем примере выполняется хранимая процедура uspGetManagerEmployees. Процедура возвращает иерархический список прямых и косвенных подчиненных ManagerID 140.
USE AdventureWorks;
GO
EXEC dbo.uspGetManagerEmployees 140;
Г. Использование dbo.uspGetWhereUsedProductID
В следующем примере выполняется хранимая процедура usp_getWhereUsedProductID. Эта процедура возвращает все продукты, использующие переднее дорожное колесо ML (ProductID 819)
USE AdventureWorks
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
Д. Использование HumanResources.uspUpdateEmployeeHireInfo
В следующем примере выполняется хранимая процедура uspUpdateEmployeeHireInfo. Эта процедура обновляет столбцы Title, HireDate и Current Flag в таблице Employee для указанных EmployeeID и добавляет новую строку в таблицу EmployeePayHistory со значениями для EmployeeID, RateChangeDate, Rate и PayFrequency. Должны быть указаны все значения параметров.
USE AdventureWorks;
GO
EXEC [HumanResources].[uspUpdateEmployeeHireInfo]
@EmployeeID = 109,
@Title = N'President',
@HireDate = '19980513',
@RateChangeDate = '20041208',
@Rate = 50.00,
@PayFrequency = 1,
@CurrentFlag = 1;
Е. Использование HumanResources.uspUpdateEmployeeLogin
В следующем примере выполняется хранимая процедура uspUpdateEmployeeLogin. Процедура обновляет столбцы ManagerID, LoginID, Title, HireDate и Current Flag в таблице Employee для EmployeeID 6. Должны быть указаны все значения параметров.
USE AdventureWorks;
GO
DECLARE @HireDate datetime;
SET @HireDate = CONVERT(DATETIME,'19990619',101);
EXEC HumanResources.uspUpdateEmployeeLogin
@EmployeeID = 6,
@ManagerID = 273,
@LoginID = N'adventure-works\david01',
@Title = N'Marketing Vice President',
@HireDate = @HireDate,
@CurrentFlag = 1 ;
Ж. Использование HumanResources.uspUpdateEmployeePersonalInfo
В следующем примере выполняется хранимая процедура uspUpdateEmployeePersonalInfo. Процедура обновляет столбцы NationalIDNumber, BirthDate, MaritalStatue и Gender в таблице Employee для EmployeeID 6. Должны быть указаны все значения параметров.
USE AdventureWorks;
GO
EXEC HumanResources.uspUpdateEmployeePersonalInfo
@EmployeeID = 6,
@NationalIDNumber = N'123-45-6789',
@BirthDate = '19651030',
@MaritalStatus = N'S',
@Gender = N'M';
GO
З. Использование dbo.uspLogError
В следующем примере делается попытка удалить продукт Mountain-400-W Silver, 38 (ProductID 980) из таблицы Production.Product. Ограничение внешнего ключа для таблицы не позволяет успешно выполнить операцию удаления, и ошибка нарушения ограничения передает управление блоку CATCH. Код внутри блока CATCH проверяет наличие любых активных транзакций и производит их откат перед выполнением хранимой процедуры uspLogError. Эта процедура заносит сведения об ошибке в таблицу ErrorLog и возвращает идентификатор ErrorLogID вставленной строки в аргумент @ErrorLogID OUTPUT. Аргумент @ErrorLogID имеет значение 0 по умолчанию. В этом случае запрашивается таблица ErrorLog, чтобы отобразить результаты выполнения хранимой процедуры.
USE AdventureWorks;
GO
BEGIN TRY
BEGIN TRANSACTION;
DELETE FROM Production.Product
WHERE ProductID = 980;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
DECLARE @ErrorLogID INT;
EXECUTE dbo.uspLogError @ErrorLogID = @ErrorLogID OUTPUT;
END CATCH;
GO
--View the results of the uspLogError stored procedure
SELECT * FROM dbo.ErrorLog;
И. Использование dbo.uspPrintError
В следующем примере делается попытка удалить продукт Mountain-400-W Silver, 38 (ProductID980) из таблицы Production.Product. Ограничение внешнего ключа для таблицы не позволяет успешно выполнить операцию удаления, и ошибка нарушения ограничения передает управление блоку CATCH. Код внутри блока CATCH выполняет хранимую процедуру uspPrintError. Эта процедура выводит сведения об ошибке на печать.
USE AdventureWorks;
GO
BEGIN TRY
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
EXECUTE dbo.uspPrintError;
END CATCH;
GO
См. также