ส่วนใหญ่เหตุผลหลักคือฟังก์ชั่นที่ประเมินค่าตารางจะส่งคืนชุดผลลัพธ์เช่นเดียวกับตารางและมุมมอง ซึ่งหมายความว่าพวกเขาสามารถนำมาใช้ในFROM
ประโยค (รวมถึงJOIN
และAPPLY
S, ฯลฯ ) ของSELECT
, UPDATE
และDELETE
คำสั่ง อย่างไรก็ตามคุณไม่สามารถใช้ Scalar UDF ในบริบทเหล่านั้นได้
EXECUTE
ประการที่สองคุณยังสามารถเป็น Scalar UDF ไวยากรณ์นี้มีประโยชน์มากเมื่อคุณมีค่าเริ่มต้นที่ระบุไว้สำหรับพารามิเตอร์อินพุต ใช้ UDF ต่อไปนี้ตัวอย่างเช่น:
CREATE FUNCTION dbo.OptionalParameterTest (@Param1 INT = 1, @Param2 INT = 2)
RETURNS INT
AS
BEGIN
RETURN @Param1 + @Param2;
END;
หากคุณต้องการใช้พารามิเตอร์อินพุตใด ๆ เป็น "ทางเลือก" คุณยังคงต้องผ่านDEFAULT
คำหลักเมื่อเรียกมันว่าเป็นฟังก์ชั่นเนื่องจากมีการแก้ไขลายเซ็น:
DECLARE @Bob1 INT;
SET @Bob1 = dbo.OptionalParameterTest(100, DEFAULT);
SELECT @Bob1;
-- Returns: 102
ในทางกลับกันถ้าคุณEXECUTE
ใช้ฟังก์ชั่นคุณสามารถใช้พารามิเตอร์ใด ๆ ที่มีค่าเริ่มต้นเป็นตัวเลือกอย่างแท้จริงเช่นเดียวกับที่คุณทำได้ด้วย Stored Procedure คุณสามารถส่งผ่านในครั้งแรกnพารามิเตอร์โดยไม่ต้องระบุชื่อพารามิเตอร์:
DECLARE @Bob2 INT;
EXEC @Bob2 = dbo.OptionalParameterTest 50;
SELECT @Bob2;
-- Returns: 52
คุณสามารถข้ามพารามิเตอร์แรกได้โดยระบุชื่อพารามิเตอร์อีกครั้งเช่นเดียวกับ Stored Procedure:
DECLARE @Bob3 INT;
EXEC @Bob3 = dbo.OptionalParameterTest @Param2 = 50;
SELECT @Bob3;
-- Returns: 51
UPDATE
ทำไมคุณอาจต้องการใช้EXEC
ไวยากรณ์เพื่อเรียกใช้ scalar UDF เช่นเดียวกับ Stored Procedure ในบางครั้งมี UDF ที่ยอดเยี่ยมที่จะมีเป็น UDF เนื่องจากสามารถเพิ่มลงในคิวรีและดำเนินการกับชุดของแถวที่ส่งคืนได้ในขณะที่ถ้ารหัสอยู่ในกระบวนงานที่เก็บไว้มันจะต้องถูกวางลงในเคอร์เซอร์เพื่อ วนซ้ำแถวหนึ่งชุด แต่มีบางครั้งที่คุณต้องการเรียกใช้ฟังก์ชันนั้นในค่าเดียวซึ่งอาจมาจากภายใน UDF อื่น การเรียกใช้ UDF สำหรับค่าเดียวสามารถทำได้ดังนี้:
SELECT dbo.UDF('some value');
ในกรณีนี้คุณจะได้รับค่าตอบแทนในชุดผลลัพธ์ (ชุดผลลัพธ์จะไม่ทำงาน) หรือสามารถทำได้ดังนี้
DECLARE @Dummy INT;
SET @Dummy = dbo.UDF('some value');
ในกรณีนี้คุณต้องประกาศ@Dummy
ตัวแปร
อย่างไรก็ตามด้วยEXEC
ไวยากรณ์คุณสามารถหลีกเลี่ยงสิ่งรบกวนทั้งสองได้:
EXEC dbo.UDF 'some value';
นอกจากนี้ UDF สเกลาร์ยังมีแผนการดำเนินการที่แคชไว้ ซึ่งหมายความว่าเป็นไปได้ที่จะพบปัญหาการดมกลิ่นของพารามิเตอร์หากมีเคียวรีใน UDF ที่มีแผนการดำเนินการ สำหรับสถานการณ์ที่เป็นไปได้ที่จะใช้EXEC
ไวยากรณ์ดังนั้นจึงเป็นไปได้ที่จะใช้WITH RECOMPILE
ตัวเลือกเพื่อละเว้นค่าที่รวบรวมไว้ของแผนสำหรับการดำเนินการนั้น ตัวอย่างเช่น:
ติดตั้ง:
GO
CREATE FUNCTION dbo.TestUDF (@Something INT)
RETURNS INT
AS
BEGIN
DECLARE @Ret INT;
SELECT @Ret = COUNT(*)
FROM sys.indexes si
WHERE si.[index_id] = @Something;
RETURN @Ret;
END;
GO
ทดสอบ:
DECLARE @Val INT;
SET @Val = dbo.TestUDF(1);
SELECT @Val;
EXEC @Val = dbo.TestUDF 0 -- uses compiled value of (1)
SELECT @Val;
EXEC @Val = dbo.TestUDF 0 WITH RECOMPILE; -- uses compiled value of (0)
SELECT @Val;
EXEC @Val = dbo.TestUDF 3 -- uses compiled value of (1)
SELECT @Val;