มีฟังก์ชัน SQL มาตรฐานที่มีผลข้างเคียงหรือไม่?


11

มาตรฐาน SQL กำหนดฟังก์ชันที่มีผลข้างเคียงหรือไม่?

ตัวอย่างเช่นพวกเขามีฟังก์ชั่นสำหรับการเขียนลงในไฟล์ * หรือเพื่อปรับปรุงค่าในคอลัมน์บางคอลัมน์ของตารางเมื่อคุณทำสิ่งที่ชอบ

SELECT myfunction(params...);

ฉันเคยเห็นสิ่งเหล่านี้บางครั้ง แต่ฉันแค่อยากรู้ว่ามาตรฐาน SQL ทำเช่นเดียวกัน


* นี่ไม่ใช่คำถามเกี่ยวกับ PostgreSQL โดยเฉพาะ ฉันใช้ตัวอย่างผลข้างเคียงที่ฉันเห็นใน PostgreSQL เท่านั้น


ฟังก์ชั่นแตกต่างกันมากในแพลตฟอร์มที่แตกต่างกัน แต่ใช่มีฟังก์ชั่นเสริมที่เป็นมาตรฐาน (เช่นมีให้โดย Oracle) ใน Oracle สำหรับการส่งอีเมล และมีฟังก์ชั่น nondeterministic ใน SQL Server เช่น NEWID และ RAND และฟังก์ชั่นใน SQL Server ก็สามารถเรียกใช้โพรซีเดอร์เพิ่มเติมได้เช่นกัน
เคดรูส์

3
หากคำถามคือ " มาตรฐาน SQL รวมฟังก์ชันที่มีผลข้างเคียงหรือไม่ " ฉันคิดว่าคำตอบคือไม่ หากคำถามคือ " มาตรฐาน SQL อนุญาตให้เขียนฟังก์ชันที่มีผลข้างเคียงหรือไม่ " ฉันคิดว่าคำตอบคือใช่
a_horse_with_no_name

@a_horse_with_no_name ขอบคุณ คำถามของฉันคืออดีตเกี่ยวกับสไตล์และการประชุม
tinlyx

คำตอบ:


18

คุณมีคำถามที่แตกต่างกันสองสามข้อที่นี่

ถาม: ฟังก์ชัน SQL มาตรฐาน ANSI คืออะไร

ฟังก์ชันมาตรฐาน ANSI คือสิ่งต่าง ๆ เช่น AVG, COUNT, MIN, MAX พวกเขากำลังครอบคลุมในมาตรฐาน ANSI ปี 1992แต่นั่นเป็นหนึ่งในการอ่านที่แห้งและน่าเบื่อ

ถาม: ฟังก์ชัน SQL มาตรฐาน ANSI เปลี่ยนข้อมูลในฐานข้อมูลหรือไม่

ไม่คุณสามารถใช้พวกเขาเพื่อเปลี่ยนข้อมูล - ตัวอย่างเช่นฉันสามารถพูดได้:

INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales

แต่ด้วยตัวเองเพียงใช้ AVG, COUNT, MIN, MAX และอื่น ๆ ไม่ควรเปลี่ยนข้อมูลอย่างถาวรภายในฐานข้อมูลของคุณ

ถาม: มาตรฐาน ANSI อนุญาตให้ฉันเขียนฟังก์ชั่นของตัวเองได้หรือไม่?

ใช่ แต่การใช้งานที่แน่นอนนั้นแตกต่างกันไปตามผู้ขายถึงผู้ขาย ฟังก์ชั่นที่คุณเขียนอาจเป็นไปตามมาตรฐานภาษา ANSI แต่สิ่งที่คุณทำในฟังก์ชั่นของคุณนั้นแย่มากอย่างเช่นสร้างผลข้างเคียง

  • เมื่อพูดถึงพฤติกรรมที่ตั้งใจไว้เป็นไปได้ที่จะได้รับคำตอบข้ามแพลตฟอร์ม
  • เมื่อพูดถึงผลข้างเคียงก็ไม่ได้

ถาม: ฉันสามารถสร้างฟังก์ชั่นของตัวเองเพื่อเขียนข้อมูลได้หรือไม่?

ทำไมถ้าคุณคิดสร้างสรรค์ ฉันเป็นคน Microsoft SQL Server ดังนั้นฉันจะมุ่งเน้นไปที่แพลตฟอร์มนั้น หน้าฟังก์ชั่นของ Books Onlineพูดว่า:

ฟังก์ชันที่ผู้ใช้กำหนดไม่สามารถใช้ในการดำเนินการที่แก้ไขสถานะฐานข้อมูลได้

ที่ฉันพูดว่า:

คุณไม่ใช่พ่อที่แท้จริงของฉัน

ดังนั้นนี่คือวิธีที่ฉันทำผิดกฎ คำเตือน: ความคิดที่เลวร้ายมากปฏิบัติตาม

  • ในฟังก์ชันของคุณให้สอบถามตารางใหม่ที่สร้างขึ้นเป็นพิเศษเพื่อจุดประสงค์ที่ชั่วร้ายนี้จากนั้นสร้างสิ่งที่เฝ้าดูตารางสำหรับคำสั่งที่เลือกแล้วเริ่มการกระทำ (เหตุการณ์ขยายการตรวจสอบหรือการติดตาม Profiler) คุณสามารถขอการคุมกำเนิดแบบ Rube Goldberg เพื่อทำงานตามคำแถลงที่เลือก
  • ในฟังก์ชั่นรหัสโทร CLR - ห่าคุณยังสามารถเรียกใช้บริการเว็บ บริการเว็บนั้นสามารถส่งข้อมูลกลับไปยังฐานข้อมูลของคุณได้เป็นอย่างดี
  • ในฟังก์ชั่นโทร xp_cmdshellและทำอะไรผ่านพรอมต์คำสั่ง (HT @AaronBertrand ในความคิดเห็น)

ตัวอย่างทั้งหมดเหล่านี้มีข้อบกพร่องอย่างมากในรูปแบบของประสิทธิภาพและความสอดคล้องของธุรกรรม คุณเพิ่งถามว่ามันสามารถทำได้ในทางทฤษฎีหรือไม่และคำตอบคือใช่ ฉันจะไม่ใช้ทั้งสองอย่างในรหัสของฉัน - ฉันจะถอยกลับและถามว่า "อะไรคือเป้าหมายทางธุรกิจที่ฉันพยายามจะทำให้สำเร็จที่นี่และมีวิธีที่ฉันสามารถทำได้เพื่อให้ได้ประสิทธิภาพและความสอดคล้องในการทำธุรกรรม ?" หากคุณต้องการคำแนะนำเฉพาะเกี่ยวกับสิ่งเหล่านั้นฉันจะถามคำถามสแต็คแยกต่างหากพร้อมคำเฉพาะเจาะจง


ขอบคุณ PSM อนุญาตให้ฟังก์ชันหรือโพรซีเดอร์มีผลข้างเคียงหรือไม่โดยที่มาตรฐาน SQL นั้นไม่มี
ทิม


-3

ฉันสามารถพูดอย่างชัดเจนเกี่ยวกับ SQL Server และปรากฏว่าไม่สอดคล้องกับการใช้ฐานข้อมูลทั้งหมด แต่ใน SQL Server ฟังก์ชั่นอาจไม่สร้างผลข้างเคียง นี่เป็นกฎที่ยากและรวดเร็วฉันพยายามหลีกเลี่ยงหลายครั้งโดยไม่ประสบความสำเร็จ

หากคุณกำลังคิดเกี่ยวกับฟังก์ชั่นในความหมายทั่วไปมีโมดูล SQL ที่อนุญาตให้มีผลข้างเคียง (ตัวอย่างเช่นขั้นตอนการจัดเก็บ) แต่ฟังก์ชั่นที่ผู้ใช้กำหนดไม่ทำ

มีคำพูดว่า "โซลูชันที่ชาญฉลาดไม่ขยาย" ซึ่งเป็นจริงอย่างยิ่งกับผลิตภัณฑ์ของ Microsoft ฉันเห็นการแก้ไขปัญหาที่ชาญฉลาดจำนวนหนึ่งใน SQL Server รุ่นก่อนหน้าซึ่งล้าสมัยในรุ่นที่ใหม่กว่าเนื่องจาก MS ได้เพิ่มพวกเขาเป็นคุณลักษณะที่แท้จริง

สิ่งที่ไม่เคยกลายเป็นคุณสมบัติตรงไปตรงมาไม่เคยกลายเป็นคุณสมบัติเพราะพื้นฐานบางอย่างของการพัฒนา T-SQL ผลข้างเคียงในฟังก์ชั่นเป็นหนึ่งในนั้น


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