Параметры в процедурах
Процедуры могут принимать параметры. Параметры бывают входными - с их помощью в процедуру можно передать некоторые значения. И также параметры бывают выходными - они позволяют возвратить из процедуры некоторое значение.
Например, пусть в базе данных будет следующая таблица 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;GOCREATE PROCEDURE AddProduct @name NVARCHAR(20), @manufacturer NVARCHAR(20), @count INT, @price MONEYASINSERT 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 MONEYSET @prodName = 'Galaxy C7'SET @company = 'Samsung'SET @price = 22000SET @prodCount = 5EXEC AddProduct @prodName, @company, @prodCount, @priceSELECT * 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;GOCREATE PROCEDURE AddProductWithOptionalCount @name NVARCHAR(20), @manufacturer NVARCHAR(20), @price MONEY, @count INT = 1ASINSERT 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 MONEYSET @prodName = 'Redmi Note 5A'SET @company = 'Xiaomi'SET @price = 22000EXEC AddProductWithOptionalCount @prodName, @company, @priceSELECT * FROM Products |
И в этом случае для параметра @count в процедуру можно не передавать значение.