Процедуры могут принимать параметры. Параметры бывают входными - с их помощью в процедуру можно передать некоторые значения. И также параметры бывают выходными - они позволяют возвратить из процедуры некоторое значение.
Например, пусть в базе данных будет следующая таблица Products:
1
2
3
4
5
6
7
8
9
| USE productsdb; CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY , ProductName NVARCHAR(30) NOT NULL , Manufacturer NVARCHAR(20) NOT NULL , ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); |
Определим процедуру, которая будет добавлять данные в эту таблицу:
1
2
3
4
5
6
7
8
9
10
| USE productsdb; GO CREATE PROCEDURE AddProduct @ name NVARCHAR(20), @manufacturer NVARCHAR(20), @ count INT , @price MONEY AS INSERT INTO Products(ProductName, Manufacturer, ProductCount, Price) VALUES (@ name , @manufacturer, @ count , @price) |
После названия процедуры идет список входных параметров, которые определяются также как и переменные - название начинается с символа @, а после названия идет тип переменной. И с помощью команды INSERT значения этих параметров будут передаваться в таблицу Products.
Используем эту процедуру:
1
2
3
4
5
6
7
8
9
10
11
12
| USE productsdb; DECLARE @prodName NVARCHAR(20), @company NVARCHAR(20); DECLARE @prodCount INT , @price MONEY SET @prodName = 'Galaxy C7' SET @company = 'Samsung' SET @price = 22000 SET @prodCount = 5 EXEC AddProduct @prodName, @company, @prodCount, @price SELECT * FROM Products |
Здесь передаваемые в процедуру значения определяются через переменные. При вызове процедуры ей через запятую передаются значения. При этом значения передаются параметрам процедуры по позиции. Так как первым определен параметр @name, то ему будет передаваться первое значение - значение переменной @prodName. Второму параметру - @manufacturer передается второе значение - значение переменной @company и так далее. Главное, чтобы между передаваемыми значениями и параметрами процедуры было соответствие по типу данных.
Также можно было бы передать непосредственно значения:
1
| EXEC AddProduct 'Galaxy C7' , 'Samsung' , 5, 22000 |
Также значения параметрам процедуры можно передавать по имени:
1
2
3
4
5
6
7
8
9
10
| USE productsdb; DECLARE @prodName NVARCHAR(20), @company NVARCHAR(20); SET @prodName = 'Honor 9' SET @company = 'Huawei' EXEC AddProduct @ name = @prodName, @manufacturer=@company, @ count = 3, @price = 18000 |
При передаче параметров по имени параметру процедуры присваивается некоторое значение.
Необязательные параметры
Параметры можно отмечать как необязательные, присваивая им некоторое значение по умолчанию. Например, в случае выше мы можем автоматически устанавливать для количества товара значение 1, если соответствующее значение не передано в процедуру:
1
2
3
4
5
6
7
8
9
10
| USE productsdb; GO CREATE PROCEDURE AddProductWithOptionalCount @ name NVARCHAR(20), @manufacturer NVARCHAR(20), @price MONEY, @ count INT = 1 AS INSERT INTO Products(ProductName, Manufacturer, ProductCount, Price) VALUES (@ name , @manufacturer, @ count , @price) |
При этом необязательные параметры лучше помещать в конце списка параметров процедуры.
1
2
3
4
5
6
7
8
| DECLARE @prodName NVARCHAR(20), @company NVARCHAR(20), @price MONEY SET @prodName = 'Redmi Note 5A' SET @company = 'Xiaomi' SET @price = 22000 EXEC AddProductWithOptionalCount @prodName, @company, @price SELECT * FROM Products |
И в этом случае для параметра @count в процедуру можно не передавать значение.
Комментариев нет:
Отправить комментарий