Процедуры могут принимать параметры. Параметры бывают входными - с их помощью в процедуру можно передать некоторые значения. И также параметры бывают выходными - они позволяют возвратить из процедуры некоторое значение.
Например, пусть в базе данных будет следующая таблица Products:
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 );
Определим процедуру, которая будет добавлять данные в эту таблицу:
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.
Используем эту процедуру:
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 и так далее. Главное, чтобы между передаваемыми значениями и параметрами процедуры было соответствие по типу данных.
Также можно было бы передать непосредственно значения:
EXEC AddProduct 'Galaxy C7', 'Samsung', 5, 22000
Также значения параметрам процедуры можно передавать по имени:
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, если соответствующее значение не передано в процедуру:
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)
При этом необязательные параметры лучше помещать в конце списка параметров процедуры.
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 в процедуру можно не передавать значение.