Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Vonatkozik a következőkre:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analitikai Platform System (PDW)
SQL adatbázis a Microsoft Fabric-ben
Az eljárásparaméterek megadásával a hívogató programok át tudják adni az értékeket az eljárás törzsébe. Ezek az értékek különböző célokra használhatók az eljárás végrehajtása során. Az eljárásparaméterek akkor is visszaadhatnak értékeket a hívó programnak, ha a paraméter paraméterként OUTPUT van megjelölve.
Egy eljárás legfeljebb 2100 paraméterrel rendelkezhet; mindegyik hozzárendelt egy nevet, adattípust és irányt. A paraméterek opcionálisan alapértelmezett értékeket is hozzárendelhetnek.
Az alábbi szakasz az értékek paraméterekbe való továbbításáról és az egyes paraméterattribútumok eljáráshívás során való használatáról nyújt tájékoztatást.
Note
A cikk gyakorlataihoz tekintse meg AdventureWorks mintaadatbázisok sorozatát. További információ: AdventureWorks-mintaadatbázisok.
Értékek átadása paraméterekbe
Az eljáráshíváshoz megadott paraméterértékeknek állandóknak vagy változóknak kell lenniük; a függvény neve nem használható paraméterértékként. A változók lehetnek felhasználó által definiált vagy rendszerváltozók, például @@spid.
Az alábbi példák bemutatják, hogyan lehet a paraméterértékeket átadni az eljárásnak uspGetWhereUsedProductID. Bemutatják, hogyan adhatja át a paramétereket állandóként és változóként, valamint azt is, hogyan használhat változót egy függvény értékének átadásához.
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
Az alábbi példa hibát ad vissza, mert egy függvény nem adható át paraméterértékként.
-- Try to use a function as a parameter value.
-- This produces an error message.
EXEC dbo.uspGetWhereUsedProductID 819, GETDATE();
Ehelyett használjon egy változót egy függvény értékének a paraméternek való átadásához, ahogyan az alábbi példában is látható:
-- Passing the function value as a variable.
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
Paraméternevek megadása
Az eljárás létrehozásakor és a paraméternév deklarálásakor a paraméternévnek egyetlen @ karakterrel kell kezdődnie, és egyedinek kell lennie az eljárás hatókörében.
A paraméterek explicit elnevezése és a megfelelő értékek hozzárendelése az eljáráshívás minden paraméteréhez lehetővé teszi, hogy a paraméterek bármilyen sorrendben legyenek megadva. Ha például az eljárás my_proc három, @first, @secondés @thirdnevű paramétert vár, az eljárásnak átadott értékek hozzárendelhetők a paraméternevekhez, például: EXECUTE my_proc @second = 2, @first = 1, @third = 3;.
Note
Ha egy paraméterértéket a @parameter = valueűrlapon ad meg, az összes további paramétert így kell megadni. Ha a paraméterértékek nem kerülnek átadásra az űrlapon @parameter = value, az értékeket azonos sorrendben kell megadni (balról jobbra), mivel a paraméterek szerepelnek az CREATE PROCEDURE utasításban. Célszerű paraméterneveket megadni, mind a kiváló olvashatóság, mind a tárolt eljárás jövőbeli verzióival való kompatibilitás érdekében.
Warning
Bármely, az űrlapon @parameter = value formában átadott és hibásan írt paraméter esetén az SQL Server hibát generál és megakadályozza az eljárás végrehajtását.
Paraméter adattípusának megadása
A paramétereket adattípussal kell definiálni, amikor utasításban CREATE PROCEDURE deklarálják őket. A paraméter adattípusa határozza meg a paraméterhez az eljárás meghívásakor elfogadott értékek típusát és tartományát. Ha például adattípussal definiál egy paramétert, akkor csak a 0 és 255 közötti numerikus értékek lesznek elfogadva, amikor az adott paraméterbe kerül. A rendszer hibát ad vissza, ha egy eljárást olyan értékkel hajtanak végre, amely nem kompatibilis az adattípussal.
Paraméter alapértelmezett értékeinek megadása
A paraméter nem kötelező, ha a paraméter alapértelmezett értéke a deklarálásakor van megadva. Nem szükséges értéket megadni egy opcionális paraméterhez egy eljáráshívásban.
A paraméter alapértelmezett értéke a következő esetekben használatos:
- Az eljáráshívásban nincs megadva érték a paraméterhez.
- A
DEFAULTkulcsszó az eljáráshívás értékeként van megadva.
Note
Ha az alapértelmezett érték egy beágyazott üres vagy írásjeleket tartalmazó karaktersztring, vagy ha egy számmal (például 6abc) kezdődik, akkor azt egy, egyenes idézőjelek közé kell foglalni.
Note
Az alapértelmezett paraméterek nem támogatottak az Azure Synapse Analytics vagy az Analytics Platform System (PDW) esetében.
Ha nem adható meg megfelelő érték a paraméter alapértelmezett értékeként, adja meg alapértelmezettként a NULL. Ha az eljárást a paraméter értéke nélkül hajtja végre, érdemes testre szabott üzenetet visszaadni.
Az alábbi példa egy bemeneti paraméterrel hozza létre a uspGetSalesYTD eljárást, @SalesPerson.
NULL a paraméter alapértelmezett értékeként van hozzárendelve, és a hibakezelési utasításokban egyéni hibaüzenetet ad vissza olyan esetekben, amikor az eljárást a @SalesPerson paraméter értéke nélkül hajtják végre.
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
Az alábbi példa végrehajtja az eljárást. Az első utasítás bemeneti érték megadása nélkül hajtja végre az eljárást. Ez azt eredményezi, hogy az eljárásban szereplő hibakezelési utasítások az egyéni hibaüzenetet küldik vissza. A második utasítás egy bemeneti értéket ad vissza, és a várt eredményhalmazt adja vissza.
-- 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
Bár az alapértelmezett értékekkel rendelkező paraméterek elhagyhatók, a nem nullázható paraméterek listája csak rövidíthető. Ha például egy eljárás öt paraméterrel rendelkezik, és nem adja meg a paraméterneveket egy @parameter = value, a negyedik és az ötödik paraméter kihagyható. A negyedik paramétert azonban nem lehet kihagyni mindaddig, amíg az ötödik paraméter szerepel, kivéve, ha a paraméterek @parameter = valueformában vannak megadva.
Több paraméter megadása alapértelmezett értékekkel
Ha megadja a paraméterek nevét, kihagyhatja a paramétereket. Fontolja meg a következő tárolt eljárást több választható paraméterrel, NULL alapértelmezett értékekkel.
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
Megadhatja vagy kihagyhatja az alapértelmezett értékekkel rendelkező paramétereket, ahogy az alábbi példák is szemléltetik, feltéve, hogy mindegyik paraméter neve meg van adva az alábbi formában: @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;
Az alábbi példa nem érvényes T-SQL szintaxis, mert a paraméternév megadása után az összes további paramétert ugyanúgy kell megadni. Minden értékhez ajánlott paraméterneveket megadni, és megelőzni a hibákat és a félreértéseket.
EXEC Production.uspSearchList @ListPrice = 150, 4, 1498;
Paraméter irányának megadása
Egy paraméter iránya vagy bemenet, egy érték kerül az eljárás törzsébe, vagy kimenet, az eljárás egy értéket ad vissza a hívó programnak. Az alapértelmezett egy bemeneti paraméter.
Kimeneti paraméter megadásához a OUTPUT kulcsszót meg kell adni a paraméter definíciójában az CREATE PROCEDURE utasításban. Az eljárás a kimeneti paraméter aktuális értékét adja vissza a hívó programnak, amikor az eljárás kilép. A hívóprogramnak a OUTPUT kulcsszót is használnia kell az eljárás végrehajtásakor a paraméter értékének a hívó programban használható változóba való mentéséhez.
Az alábbi példa létrehozza a Production.usp_GetList eljárást, amely visszaadja azoknak a termékeknek a listáját, amelyek árai nem lépik túl a megadott mennyiséget. A példa több SELECT utasítás és több OUTPUT paraméter használatát mutatja be.
OUTPUT a paraméterek lehetővé teszik, hogy egy külső eljárás, köteg vagy egynél több Transact-SQL utasítás hozzáférjen az eljárás végrehajtása során beállított értékhez.
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
Hajtsa végre a usp_GetList az Adventure Works-termékek (Bikes) 700 dollárnál kisebb költségű listájának visszaadásához. A OUTPUT paraméterek, @cost és @compareprices a folyamatvezérlő nyelv használatával küldik vissza az üzeneteket az Üzenetek ablakban.
Note
A OUTPUT változót az eljárás létrehozásakor és a változó használata során is meg kell határozni. A paraméter nevének és a változó nevének nem kell egyeznie. Az adattípusnak és a paraméterhelyezésnek azonban meg kell egyeznie (kivéve, ha @listprice = variable használ).
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)))+'.';
Íme a részleges eredményhalmaz:
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.