Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Database Azure
SQLInstans
Terkelola Azure SQLAzure Synapse Analytics
Sistem Platform Analitik (PDW)
Database SQL di Microsoft Fabric
Dengan menentukan parameter prosedur, program panggilan dapat meneruskan nilai ke dalam isi prosedur. Nilai-nilai tersebut dapat digunakan untuk berbagai tujuan selama eksekusi prosedur. Parameter prosedur juga dapat mengembalikan nilai ke program panggilan jika parameter ditandai sebagai OUTPUT parameter.
Prosedur dapat memiliki maksimum 2.100 parameter; masing-masing diberi nama, jenis data, dan arah. Secara opsional, parameter dapat ditetapkan nilai default.
Bagian berikut ini menyediakan informasi tentang meneruskan nilai ke parameter dan tentang bagaimana masing-masing atribut parameter digunakan selama panggilan prosedur.
Note
AdventureWorks Lihat rangkaian database sampel untuk latihan artikel ini. Untuk informasi selengkapnya, lihat Database sampel AdventureWorks.
Meneruskan nilai ke dalam parameter
Nilai parameter yang disediakan dengan panggilan prosedur harus konstanta atau variabel; nama fungsi tidak dapat digunakan sebagai nilai parameter. Variabel dapat ditentukan pengguna atau variabel sistem seperti @@spid.
Contoh berikut menunjukkan meneruskan nilai parameter ke prosedur uspGetWhereUsedProductID. Mereka menggambarkan cara meneruskan parameter sebagai konstanta dan variabel dan juga cara menggunakan variabel untuk meneruskan nilai fungsi.
USE AdventureWorks2022;
GO
-- Passing values as constants.
EXEC dbo.uspGetWhereUsedProductID 819, '20050225';
GO
-- Passing values as variables.
DECLARE @ProductID int, @CheckDate datetime;
SET @ProductID = 819;
SET @CheckDate = '20050225';
EXEC dbo.uspGetWhereUsedProductID @ProductID, @CheckDate;
GO
Contoh berikut mengembalikan kesalahan karena fungsi tidak dapat diteruskan sebagai nilai parameter.
-- Try to use a function as a parameter value.
-- This produces an error message.
EXEC dbo.uspGetWhereUsedProductID 819, GETDATE();
Sebagai gantinya, gunakan variabel untuk meneruskan nilai fungsi ke parameter , seperti dalam contoh berikut:
-- Passing the function value as a variable.
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
Tentukan nama parameter
Saat membuat prosedur dan mendeklarasikan nama parameter, nama parameter harus dimulai dengan satu @ karakter dan harus unik dalam cakupan prosedur.
Secara eksplisit menamai parameter dan menetapkan nilai yang sesuai ke setiap parameter dalam panggilan prosedur memungkinkan parameter disediakan dalam urutan apa pun. Misalnya, jika prosedur my_proc mengharapkan tiga parameter bernama @first, , @seconddan @third, nilai yang diteruskan ke prosedur dapat ditetapkan ke nama parameter, seperti: EXECUTE my_proc @second = 2, @first = 1, @third = 3;.
Note
Jika satu nilai parameter disediakan dalam formulir @parameter = value, semua parameter berikutnya harus disediakan dengan cara ini. Jika nilai parameter tidak diteruskan dalam formulir @parameter = value, nilai harus disediakan dalam urutan yang identik (kiri ke kanan) karena parameter tercantum dalam CREATE PROCEDURE pernyataan. Ini adalah praktik yang baik untuk menentukan nama parameter, baik untuk keterbacaan dan kompatibilitas yang unggul dengan versi prosedur yang disimpan di masa mendatang.
Warning
Parameter apa pun yang diteruskan dalam formulir @parameter = value dengan parameter salah eja, akan menyebabkan SQL Server menghasilkan kesalahan dan mencegah eksekusi prosedur.
Tentukan jenis data parameter
Parameter harus didefinisikan dengan jenis data saat dinyatakan dalam pernyataan CREATE PROCEDURE . Jenis data parameter menentukan jenis dan rentang nilai yang diterima untuk parameter saat prosedur dipanggil. Misalnya, jika Anda menentukan parameter dengan jenis data kecil , hanya nilai numerik mulai dari 0 hingga 255 yang diterima saat diteruskan ke parameter tersebut. Kesalahan dikembalikan jika prosedur dijalankan dengan nilai yang tidak kompatibel dengan jenis data.
Tentukan nilai default parameter
Parameter dianggap opsional jika parameter memiliki nilai default yang ditentukan saat dinyatakan. Tidak perlu memberikan nilai untuk parameter opsional dalam panggilan prosedur.
Nilai default parameter digunakan saat:
- Tidak ada nilai untuk parameter yang ditentukan dalam panggilan prosedur.
- Kata
DEFAULTkunci ditentukan sebagai nilai dalam panggilan prosedur.
Note
Jika nilai default adalah string karakter yang berisi spasi atau tanda baca yang disematkan, atau jika dimulai dengan angka (misalnya, 6abc), harus diapit dalam tanda kutip lurus tunggal.
Note
Parameter default tidak didukung di Azure Synapse Analytics atau Analytics Platform System (PDW).
Jika tidak ada nilai yang dapat ditentukan dengan tepat sebagai default untuk parameter , tentukan NULL sebagai default. Sebaiknya prosedur mengembalikan pesan yang disesuaikan jika prosedur dijalankan tanpa nilai untuk parameter .
Contoh berikut membuat uspGetSalesYTD prosedur dengan satu parameter input, @SalesPerson.
NULL ditetapkan sebagai nilai default untuk parameter dan digunakan dalam pernyataan penanganan kesalahan untuk mengembalikan pesan kesalahan kustom untuk kasus ketika prosedur dijalankan tanpa nilai untuk @SalesPerson parameter.
USE AdventureWorks2022;
GO
IF OBJECT_ID('Sales.uspGetSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE Sales.uspGetSalesYTD;
GO
CREATE PROCEDURE Sales.uspGetSalesYTD
@SalesPerson nvarchar(50) = NULL -- NULL default value
AS
SET NOCOUNT ON;
-- Validate the @SalesPerson parameter.
IF @SalesPerson IS NULL
BEGIN
PRINT 'ERROR: You must specify the last name of the sales person.'
RETURN
END
-- Get the sales for the specified sales person and
-- assign it to the output parameter.
SELECT SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID
WHERE LastName = @SalesPerson;
RETURN
GO
Contoh berikut ini menjalankan prosedurnya. Pernyataan pertama menjalankan prosedur tanpa menentukan nilai input. Hal ini menyebabkan pernyataan penanganan kesalahan dalam prosedur mengembalikan pesan kesalahan kustom. Pernyataan kedua menyediakan nilai input dan mengembalikan tataan hasil yang diharapkan.
-- Run the procedure without specifying an input value.
EXEC Sales.uspGetSalesYTD;
GO
-- Run the procedure with an input value.
EXEC Sales.uspGetSalesYTD N'Blythe';
GO
Meskipun parameter yang defaultnya telah disediakan dapat dihilangkan, daftar parameter yang tidak dapat diubah ke null hanya dapat dipotong. Misalnya, jika prosedur memiliki lima parameter, tanpa menentukan nama parameter dengan @parameter = value, parameter keempat dan kelima dapat dihilangkan. Namun, parameter keempat tidak dapat dilewati selama parameter kelima disertakan, kecuali parameter disediakan dalam formulir @parameter = value.
Tentukan beberapa parameter dengan nilai default
Anda dapat menghilangkan parameter jika Anda menentukan nama parameter. Pertimbangkan prosedur tersimpan berikut dengan beberapa parameter opsional dengan NULL nilai default.
USE AdventureWorks2022;
GO
IF OBJECT_ID ( 'Production.uspSearchList', 'P' ) IS NOT NULL
DROP PROCEDURE Production.uspSearchList;
GO
CREATE PROCEDURE Production.uspSearchList
@ListPrice money
, @ProductCategoryID int = NULL -- NULL default value
, @ProductSubcategoryID int = NULL -- NULL default value
, @ProductBusinessEntityID int = NULL -- NULL default value
AS
SET NOCOUNT ON;
SELECT
p.Name, p.Class, p.ListPrice, p.ProductID, pc.Name, psc.Name, v.Name
FROM
Production.Product AS p
INNER JOIN Production.ProductSubCategory AS psc ON p.ProductSubcategoryID = psc.ProductSubcategoryID
INNER JOIN Production.ProductCategory AS pc ON psc.ProductCategoryID = pc.ProductCategoryID
INNER JOIN Purchasing.ProductVendor AS pv ON p.ProductID = pv.ProductID
INNER JOIN Purchasing.Vendor AS v ON pv.BusinessEntityID = v.BusinessEntityID
WHERE (p.ListPrice < @ListPrice)
AND (pc.ProductCategoryID = @ProductCategoryID or @ProductCategoryID IS NULL)
AND (psc.ProductSubcategoryID = @ProductSubcategoryID or @ProductSubcategoryID IS NULL)
AND (pv.BusinessEntityID = @ProductBusinessEntityID or @ProductBusinessEntityID IS NULL);
GO
Anda dapat menentukan atau menghilangkan parameter dengan nilai default, seperti yang ditunjukkan oleh serangkaian contoh berikut, selama masing-masing disediakan dengan nama parameternya dalam formulir @parameter = value:
--Find all Products with a list price less than 150.00 and in the ProductCategoryID = 4
EXEC Production.uspSearchList @ListPrice = 150, @ProductCategoryID = 4;
--Find all Products with a list price less than 150.00 and in the ProductSubCategoryID = 36
EXEC Production.uspSearchList @ListPrice = 150, @ProductSubCategoryID = 36;
--Find all Products with a list price less than 150.00 and from @ProductBusinessEntityID = 1498
EXEC Production.uspSearchList @ListPrice = 150, @ProductBusinessEntityID = 1498;
--Find all Products with a list price less than 150.00 and in the ProductSubCategoryID = 36 and from @ProductBusinessEntityID = 1498
EXEC Production.uspSearchList @ListPrice = 150, @ProductCategoryID = 4, @ProductBusinessEntityID = 1498;
Contoh berikut tidak valid sintaks T-SQL, karena semua parameter berikutnya harus disediakan dengan cara yang sama, setelah nama parameter disediakan. Menyediakan nama parameter untuk semua nilai selalu direkomendasikan dan mencegah kesalahan dan kebingungan.
EXEC Production.uspSearchList @ListPrice = 150, 4, 1498;
Tentukan arah parameter
Arah sebuah parameter bisa berupa input, di mana nilai diteruskan ke dalam isi prosedur, atau output, di mana prosedur mengembalikan nilai ke program pemanggil. Defaultnya adalah parameter input.
Untuk menentukan parameter output, OUTPUT kata kunci harus ditentukan dalam definisi parameter dalam CREATE PROCEDURE pernyataan. Prosedur menampilkan nilai saat ini dari parameter output ke program panggilan ketika prosedur keluar. Program panggilan juga harus menggunakan OUTPUT kata kunci saat menjalankan prosedur untuk menyimpan nilai parameter dalam variabel yang dapat digunakan dalam program panggilan.
Contoh berikut membuat Production.usp_GetList prosedur, yang mengembalikan daftar produk yang memiliki harga yang tidak melebihi jumlah yang ditentukan. Contoh menunjukkan penggunaan beberapa SELECT pernyataan dan beberapa OUTPUT parameter.
OUTPUT parameter memungkinkan prosedur eksternal, batch, atau lebih dari satu pernyataan Transact-SQL untuk mengakses nilai yang ditetapkan selama eksekusi prosedur.
USE AdventureWorks2022;
GO
IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList
@Product varchar(40)
, @MaxPrice money
, @ComparePrice money OUTPUT
, @ListPrice money OUT
AS
SET NOCOUNT ON;
SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO
Jalankan usp_GetList untuk mengembalikan daftar produk Adventure Works (Bikes) yang harganya kurang dari $700. Parameter OUTPUT@cost dan @compareprices digunakan dengan bahasa kontrol aliran untuk mengembalikan pesan di jendela Pesan .
Note
Variabel OUTPUT harus didefinisikan selama pembuatan prosedur dan juga selama penggunaan variabel. Nama parameter dan nama variabel tidak harus cocok. Namun, jenis data dan pemosisian parameter harus cocok (kecuali @listprice = variable digunakan).
DECLARE @ComparePrice money, @Cost money ;
EXECUTE Production.uspGetList '%Bikes%', 700,
@ComparePrice OUT,
@Cost OUTPUT
IF @Cost <= @ComparePrice
BEGIN
PRINT 'These products can be purchased for less than
$'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'
END
ELSE
PRINT 'The prices for all products in this category exceed
$'+ RTRIM(CAST(@ComparePrice AS varchar(20)))+'.';
Berikut adalah kumpulan hasil parsial:
Product List Price
-------------------------------------------------- ------------------
Road-750 Black, 58 539.99
Mountain-500 Silver, 40 564.99
Mountain-500 Silver, 42 564.99
...
Road-750 Black, 48 539.99
Road-750 Black, 52 539.99
(14 row(s) affected)
These items can be purchased for less than $700.00.