ฟังก์ชัน SQL เป็นค่าพารามิเตอร์เริ่มต้น?


105

ฉันลองเปลี่ยนค่าพารามิเตอร์เริ่มต้นด้วยสิ่งนี้:

ALTER PROCEDURE [dbo].[my_sp]
@currentDate datetime = GETDATE()

และ SQL pre-compiler ทั้งหมดให้ฉันคือข้อผิดพลาดนี้:

ข่าวสารเกี่ยวกับ 102, ระดับ 15, สถานะ 1, ขั้นตอน my_sp, บรรทัดที่ 8 ไวยากรณ์ไม่ถูกต้องใกล้ '('.

ฉันได้สร้างขั้นตอนแล้ว (ฉันไม่แน่ใจว่าเกี่ยวข้องหรือไม่) ฉันใช้ค่าเริ่มต้นที่เป็นโมฆะและตรวจสอบในภายหลัง แต่ดูเหมือนจะไม่เหมาะสม ฉันสามารถทำสิ่งนี้ในบรรทัดเดียวได้หรือไม่?


อัปเดต: ฉันกำลังจะออกจากคำอธิบายของ MSDN เกี่ยวกับพารามิเตอร์ขั้นตอนการจัดเก็บ :

[= default] เป็นค่าเริ่มต้นสำหรับพารามิเตอร์ หากกำหนดค่าดีฟอลต์ฟังก์ชันสามารถดำเนินการได้โดยไม่ต้องระบุค่าสำหรับพารามิเตอร์นั้น

หมายเหตุ:
ค่าพารามิเตอร์ดีฟอลต์สามารถระบุได้สำหรับฟังก์ชัน CLR ยกเว้นชนิดข้อมูล varchar (max) และ varbinary (max)

เมื่อพารามิเตอร์ของฟังก์ชันมีค่าดีฟอลต์คีย์เวิร์ด DEFAULT จะต้องถูกระบุเมื่อฟังก์ชันถูกเรียกเพื่อดึงค่าดีฟอลต์ ลักษณะการทำงานนี้แตกต่างจากการใช้พารามิเตอร์ที่มีค่าดีฟอลต์ในโพรซีเดอร์ที่เก็บไว้ซึ่งการละเว้นพารามิเตอร์ยังหมายถึงค่าดีฟอลต์ด้วย

ฉันอ่านผิดหรือเปล่า?

ขอบคุณมาก.

คำตอบ:


162

ค่าเริ่มต้นสำหรับขั้นตอนการเก็บพารามิเตอร์จะต้องมีค่าคงที่ คุณต้องทำสิ่งต่อไปนี้ ...

ALTER Procedure [dbo].[my_sp]
@currentDate datetime = null
AS
IF @currentDate is null
SET @currentDate = getdate()

37
หรือ SET @currentDate = COALESCE (@ currentDate, GETDATE ())
SQLMenace

ฉันใช้ก่อนหน้านี้ "ฉันใช้ค่าเริ่มต้นที่เป็นโมฆะและตรวจสอบในภายหลัง แต่ดูเหมือนจะไม่เหมาะสม" ยังคงขอบคุณไบรอัน
user58044

โซลูชันนี้สมบูรณ์แบบ
R.Katnaan

35

ฉันไม่คิดว่าจะเป็นไปได้คุณต้องใช้ค่าตัวอักษร (ค่าคงที่) เป็นค่าเริ่มต้น

อย่างไรก็ตามคุณสามารถทำได้:

Set @currentDate = Coalesce(@currentDate , GetDate())


8

ฉันสรุปว่าคุณกำลังใช้ Microsoft SQL Server จากวงเล็บเหลี่ยมในตัวอย่างของคุณ

จากMSDN :

เฉพาะค่าคงที่เช่นสตริงอักขระ ฟังก์ชันสเกลาร์ (ทั้งระบบกำหนดโดยผู้ใช้หรือฟังก์ชัน CLR) หรือ NULL สามารถใช้เป็นค่าเริ่มต้น

ฟังก์ชันGETDATE()จะส่งคืนค่าที่แตกต่างกันเป็นครั้งคราวดังนั้นจึงไม่ใช่นิพจน์คงที่



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.