พารามิเตอร์ทางเลือกใน SQL Server ที่จัดเก็บ proc?


125

ฉันกำลังเขียน procs ที่เก็บไว้ใน SQL Server 2008 และสงสัยว่าแนวคิดของพารามิเตอร์อินพุตที่เป็นทางเลือกนั้นเป็นไปได้หรือไม่?

ฉันคิดว่าฉันสามารถส่งผ่านค่า NULL สำหรับพารามิเตอร์ที่ฉันไม่ต้องการใช้ตรวจสอบค่าใน proc ที่เก็บไว้แล้วนำสิ่งต่าง ๆ จากที่นั่น แต่ฉันสนใจว่าแนวคิดนี้มีอยู่ที่นี่หรือไม่ ขอบคุณ!


2
อ่านเว็บไซต์ของ Erland เป็นเวลานานเขามีข้อมูลที่ยอดเยี่ยมเกี่ยวกับเงื่อนไขการค้นหาแบบไดนามิก: sommarskog.se/dyn-search.html
Aaron Bertrand

คำตอบ:


201

คุณสามารถประกาศเช่นนี้

CREATE PROCEDURE MyProcName
    @Parameter1 INT = 1,
    @Parameter2 VARCHAR (100) = 'StringValue',
    @Parameter3 VARCHAR (100) = NULL
AS

/* check for the NULL / default value (indicating nothing was passed */
if (@Parameter3 IS NULL)
BEGIN
    /* whatever code you desire for a missing parameter*/
    INSERT INTO ........
END

/* and use it in the query as so*/
SELECT *
FROM Table
WHERE Column = @Parameter

จะเกิดอะไรขึ้นถ้าพารามิเตอร์เป็นชนิดของตัวบ่งชี้เฉพาะ? อดีต @userId uniqueidentifier
RK Sharma

1
ตอบ @RKSharma สำหรับใครก็ตามที่สงสัยเหมือนกัน - มันใช้งานได้เหมือนกันกับตัวบ่งชี้เฉพาะ
rinukkusu

55

ใช่แล้ว. ประกาศพารามิเตอร์ดังนี้:

@Sort varchar(50) = NULL

ตอนนี้คุณไม่ต้องส่งพารามิเตอร์เข้ามาด้วยซ้ำโดยค่าเริ่มต้นจะเป็น NULL (หรืออะไรก็ตามที่คุณเลือกเป็นค่าเริ่มต้น)


คุณไม่จำเป็นต้องใช้= NULL
OMG Ponies

3
แน่ใจเหรอว่าไม่ต้องการ
Mike Cole

43
OMG Ponies หากคุณไม่รวม = <NULL | ค่าเริ่มต้นบางค่า> พารามิเตอร์จะต้อง คุณสามารถส่งผ่านเป็นโมฆะ แต่จากนั้นคุณก็เปลี่ยนตรรกะนั้นไปยังแอปพลิเคชันที่ใช้โพรซีเดอร์
Aaron Bertrand

10
เพิ่มไปยังจุดของแอรอน จะดีกว่าถ้าใช้ "= NULL" หากคุณกำลังเพิ่มพารามิเตอร์ทางเลือกใหม่ให้กับ proc ที่เก็บไว้ที่มีอยู่ เหตุผลก็คือคุณอาจไม่ทราบถึงรหัสทั้งหมดที่เรียก proc นี้ ดังนั้นเว้นแต่คุณจะกำหนดเป็นทางเลือกโดยใช้ "= NULL" สำหรับสถานที่ทั้งหมดที่คุณอาจพลาดที่จะส่งผ่านค่านั้นจะแตก
nanonerd

nanonerd: 2014 ขึ้นไปอย่างน้อยคุณสามารถตั้งค่าเริ่มต้นได้และจะใช้เวลานั้นและจะไม่เกิดข้อผิดพลาดเมื่อคุณไม่ผ่านพารามิเตอร์นั้น อย่างน้อยนั่นก็เป็นวิธีที่ได้ผลสำหรับฉันในปี 2014 ด้วย
billpennock

0

2014 ขึ้นไปอย่างน้อยคุณสามารถตั้งค่าเริ่มต้นได้และจะใช้เวลาและไม่ผิดพลาดเมื่อคุณไม่ผ่านพารามิเตอร์นั้น ตัวอย่างบางส่วน: พารามิเตอร์ที่ 3 ถูกเพิ่มเป็นทางเลือก ดำเนินการตามขั้นตอนจริงที่มีเพียงสองพารามิเตอร์แรกเท่านั้นที่ทำงานได้ดี

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.