ไวยากรณ์ที่ไม่ถูกต้องใกล้ ')' การเรียกขั้นตอนการจัดเก็บกับ GETDATE


121

บางทีฉันอาจจะมีช่วงเวลา 'บ่าย' แต่มีใครอธิบายได้ไหมว่าทำไมฉันถึงได้

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

เมื่อทำงาน

CREATE PROC DisplayDate 
    (@DateVar DATETIME) 
AS 
BEGIN
    SELECT @DateVar
END
GO

EXEC DisplayDate GETDATE();

คำตอบ:


170

คุณไม่สามารถส่งผ่านในการเรียกใช้ฟังก์ชันเป็นอาร์กิวเมนต์ไปยังกระบวนงานที่เก็บไว้ของคุณ ใช้ตัวแปรกลางแทน:

DECLARE @tmp DATETIME
SET @tmp = GETDATE()

EXEC DisplayDate @tmp;

23
มีเหตุผลสำหรับข้อ จำกัด นี้หรือไม่?
Zameer

@ นักเรียนมีเหตุผลสำหรับข้อ จำกัด พื้นฐานเช่นการขาดประเภทคอลัมน์บูลีนและจำนวนเต็มหรือไม่มีคีย์ที่กรองใน Oracle ... ?
Skipper

20

ดังที่Mitch Wheatกล่าวว่าคุณไม่สามารถส่งผ่านฟังก์ชันได้

หากในกรณีของคุณคุณควรส่งผ่านค่าที่คำนวณล่วงหน้าหรือ GETDATE () - คุณสามารถใช้ค่าเริ่มต้นได้ ตัวอย่างเช่นแก้ไขขั้นตอนการจัดเก็บของคุณ:

ALTER PROC DisplayDate 
(
    @DateVar DATETIME = NULL
) AS 
BEGIN
    set @DateVar=ISNULL(@DateVar,GETDATE())

    --the SP stuff here
    SELECT @DateVar
END
GO

แล้วลอง:

EXEC DisplayDate '2013-02-01 00:00:00.000'
EXEC DisplayDate

หมายเหตุ : ที่นี่ฉันคิดว่าค่า NULL ไม่ได้ใช้สำหรับพารามิเตอร์นี้ หากไม่ใช่กรณีของคุณคุณสามารถใช้ค่าอื่นที่ไม่ได้ใช้เช่น "1900-01-01 00: 00: 00.000"

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