คำถามติดแท็ก functions

ฟังก์ชั่นดำเนินการงานที่ระบุบางอย่างมักจะรับพารามิเตอร์เป็นอินพุต ในแง่ของฐานข้อมูลสิ่งเหล่านี้อาจเฉพาะ SQL หรือผู้จำหน่ายฐานข้อมูล

1
อธิบายการวิเคราะห์ไม่แสดงรายละเอียดของการสืบค้นภายในฟังก์ชั่น plpgsql
ฉันใช้ฟังก์ชั่น PL / pgSQL ใน PostgreSQL 9.3 พร้อมกับคำสั่งที่ซับซ้อนหลายอย่างภายใน create function f1() returns integer as $$ declare event tablename%ROWTYPE; .... .... begin FOR event IN SELECT * FROM tablename WHERE condition LOOP EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return; END LOOP; ... INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN …

3
NVL หมายถึงอะไร
สิ่งที่NVLยืนหยัดเพื่อ? ฉันกำลังพูดถึงฟังก์ชั่นของ Oracle และ Informix (อาจจะเป็นบางอย่างเช่นกัน) ที่ใช้ในการกรองค่าที่ไม่ใช่ค่า NULL จากผลลัพธ์การสืบค้น (คล้ายกับCOALESCEในฐานข้อมูลอื่น)

2
ปิดใช้งานการตรวจสอบ Schema On Function / Stored Procedure
ฉันพยายามทำให้กระบวนการที่ดำเนินการเปลี่ยนแปลงกับฐานข้อมูล SQL Server 2008 R2 เป็นไปโดยอัตโนมัติ กระบวนการที่ฉันวางไว้และสร้างโพรซีเดอร์และฟังก์ชันที่เก็บไว้ของฉันใหม่รวมถึงเรียกใช้สคริปต์เพื่อเปลี่ยนตาราง / คอลัมน์ / ข้อมูล น่าเสียดายที่สคริปต์ตัวใดตัวหนึ่งต้องใช้ฟังก์ชันใดฟังก์ชันหนึ่งก่อน แต่ฉันไม่สามารถเรียกใช้การเปลี่ยนแปลง proc / ฟังก์ชั่นที่เก็บไว้ได้ทั้งหมดเพราะมันอาศัยคอลัมน์ที่เพิ่มเข้ามาจากสคริปต์การเปลี่ยนแปลงตาราง / คอลัมน์ / ข้อมูลก่อน ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะเรียกใช้โพรซีเดอร์และฟังก์ชันที่เก็บไว้โดยไม่มี SQL Server ตรวจสอบคอลัมน์ที่ใช้ในการกำหนดฟังก์ชัน / SP? ฉันพยายามค้นหา แต่ไม่พบเงื่อนไขหรือคำสั่งเพื่อเปิดใช้งานสิ่งนี้

4
การวางคอลัมน์ PostgreSQL 9.6 และผลข้างเคียงต่อฟังก์ชัน SQL ด้วย CTE
ถ้าฉันมีตารางที่มี 3 คอลัมน์ - พูด A, B และ D - และฉันต้องแนะนำใหม่ - พูด C เพื่อแทนที่ตำแหน่งปัจจุบันของ D ฉันจะใช้วิธีการต่อไปนี้: แนะนำ 2 คอลัมน์ใหม่เป็น C และ D2 คัดลอกเนื้อหาของ D ถึง D2 ลบ D. เปลี่ยนชื่อ D2 เป็น D คำสั่งซื้อใหม่จะเป็น A, B, C และ D ฉันคิดว่านี่เป็นวิธีปฏิบัติที่ถูกต้องตามกฎหมายเพราะจนถึงตอนนี้มันก็ไม่มีปัญหา อย่างไรก็ตามวันนี้ฉันเจอปัญหาเมื่อฟังก์ชั่นที่ดำเนินการคำสั่งบนตารางเดียวกันส่งคืนข้อผิดพลาดต่อไปนี้: table row type and query-specified row type do not …

2
ทำไมฟังก์ชันอันทรงคุณค่าของสเกลาร์ต้องได้รับอนุญาตให้ดำเนินการแทนที่จะเลือก
ฉันสงสัยว่าเพราะเหตุใดสำหรับฟังก์ชันที่มีค่าสเกลาร์ฉันต้องให้ผู้ใช้ดำเนินการแทนที่จะเลือกเท่านั้น? ในขณะที่ฟังก์ชั่นที่มีคุณค่าของตารางนั้นใช้งานได้ดีโดยมีเพียงสิทธิ์อนุญาตหรือความdb_datareaderเป็นสมาชิกที่เลือกเท่านั้น เพื่อให้ชัดเจนยิ่งขึ้นนี่คือตัวอย่างของฉัน: ฉันต้องการผู้ใช้ที่ได้รับอนุญาตให้อ่านฐานข้อมูลเท่านั้น ดังนั้นฉันจึงสร้างผู้ใช้ที่เรียกว่าtestUserและให้การdb_datareaderเป็นสมาชิก fn_InlineTableแล้วฉันสร้างตารางมูลค่าฟังก์ชั่นที่เรียกว่า และทุกอย่างยอดเยี่ยม testUserรัน SQL นี้ตลอดทั้งวัน select * from dbo.fn_InlineTable fn_ScalarTestแล้วฉันต้องมีฟังก์ชั่นเกลาดังนั้นฉันสร้างฟังก์ชั่นที่เรียกว่าสเกลา testUserไม่สามารถรัน SQL นี้ Select dbo.fn_ScalarTest(1) ดีเข้าใจ: มันเป็นเพราะผมยังไม่ได้ให้ "testuser" fn_ScalarTestได้รับอนุญาตในการดำเนินการ คำถามของฉันคือ: ตามลิงค์นี้/programming/6150888/insert-update-delete-with-function-in-sql-serverซึ่งบอกว่าFUNCTIONไม่สามารถใช้เพื่อดำเนินการแก้ไขสถานะฐานข้อมูลได้ . ดังนั้นทำไมไม่ปล่อยให้ฟังก์ชั่นสเกลาร์ถูกใช้ด้วยสิทธิ์ "SELECT" แบบเดียวกันแทนที่จะเรียกใช้สิทธิ์ ??? ฉันหวังว่าคำถามของฉันจะสมเหตุสมผล ขอขอบคุณ.

3
สร้างฟังก์ชั่นใหม่ด้วยรหัสถ้ามันไม่มีอยู่
ฉันต้องการสร้างฟังก์ชั่นใหม่ตามสคริปต์ในฐานข้อมูลของฉัน รหัสสคริปต์ด้านล่าง: IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End แต่เมื่อฉันรันสคริปต์ข้างต้น SQL Server จะส่งคืนข้อผิดพลาด: 'CREATE FUNCTION' must be the first statement in a query batch.

1
จะใช้การเข้ารหัส aes ใน PostgreSQL ได้อย่างไร
ฉันลองเข้ารหัส aes โดยใช้ข้อความต่อไปนี้: SELECT encrypt('test', 'key', 'aes'); ซึ่งใช้งานได้ แต่ฉันไม่สามารถถอดรหัสค่าได้ ฉันใส่มันลงในเขตข้อมูลชนิดข้อมูลไบต์แต่ฉันไม่แน่ใจว่าเป็นวิธีที่ถูกต้องหรือไม่ SELECT decrypt(pw, 'key', 'aes') FROM table WHERE ID = 1; ทำให้ฉันมีข้อผิดพลาด ข้อผิดพลาด: ถอดรหัสฟังก์ชัน (bytea, ไม่ทราบ, ไม่ทราบ) ไม่มีอยู่ บรรทัดที่ 1: เลือกตัวถอดรหัส (pw, 'key', 'aes') จาก tabelle WHERE ID = 7; ^ คำแนะนำ: ไม่มีฟังก์ชันที่ตรงกับชื่อและประเภทอาร์กิวเมนต์ที่กำหนด คุณอาจจำเป็นต้องเพิ่ม casts ประเภทชัดเจน นั่นหมายความว่าการเข้ารหัส () เป็นฟังก์ชั่นที่มีอยู่ แต่ไม่ถอดรหัส () …


2
วิธีการติดตั้งอัลกอริธึมตาม / UDF
ฉันมีอัลกอริทึมที่ฉันต้องเรียกใช้กับทุกแถวในตารางที่มี 800K แถวและ 38 คอลัมน์ อัลกอริทึมถูกนำมาใช้ใน VBA และทำการคำนวณทางคณิตศาสตร์โดยใช้ค่าจากบางคอลัมน์เพื่อจัดการคอลัมน์อื่น ปัจจุบันฉันใช้ Excel (ADO) เพื่อสอบถาม SQL และใช้ VBA กับเคอร์เซอร์ฝั่งไคลเอ็นต์เพื่อใช้อัลกอริทึมโดยวนซ้ำทุกแถว มันใช้งานได้ แต่ใช้เวลา 7 ชั่วโมงในการทำงาน รหัส VBA นั้นซับซ้อนพอที่จะทำการถอดรหัสเป็น T-SQL ได้เป็นจำนวนมาก ฉันได้อ่านเกี่ยวกับการรวม CLR และ UDF เป็นเส้นทางที่เป็นไปได้ ฉันคิดเกี่ยวกับการใส่รหัส VBA ในงานสคริปต์ SSIS เพื่อเข้าใกล้ฐานข้อมูล แต่แน่ใจว่ามีผู้เชี่ยวชาญด้านวิธีการสำหรับปัญหาด้านประสิทธิภาพประเภทนี้อยู่ เป็นการดีที่ฉันจะสามารถเรียกใช้อัลกอริทึมกับแถวมากที่สุด (ทั้งหมด?) เป็นไปได้ในวิธีการตั้งค่าแบบขนาน ความช่วยเหลือใด ๆ ที่บอกล่วงหน้าถึงวิธีการรับประสิทธิภาพที่ดีที่สุดกับปัญหาประเภทนี้ --Edit ขอบคุณสำหรับความคิดเห็นฉันใช้ MS SQL 2014 Enterprise ต่อไปนี้เป็นรายละเอียดเพิ่มเติม: อัลกอริทึมค้นหารูปแบบลักษณะในข้อมูลอนุกรมเวลา …

5
มีวิธีการตั้งเจ้าของวัตถุทั้งหมดในฐานข้อมูล PostgreSQL ในเวลาเดียวกัน?
/programming/1348126/modify-owner-on-all-tables-simultaneously-in-postgresqlอธิบายวิธีที่ดีในการเปลี่ยนตารางและวัตถุอื่น ๆ ให้กับผู้ใช้ที่เฉพาะเจาะจงและใช้งานได้ทั้งหมด คำแนะนำดูเหมือนจะไม่สนใจฟังก์ชั่นที่ฉันสร้างขึ้น มีวิธีที่ค่อนข้างง่ายในการรีเซ็ตเจ้าของวัตถุทั้งหมดในฐานข้อมูลรวมถึงฟังก์ชั่นหรือไม่? การทำด้วยมือเป็นสิ่งที่ไม่พึงปรารถนาอย่างมาก

1
จะกรองการใช้ฟังก์ชันที่ผู้ใช้กำหนดเองของ Scalar จากข้อมูลการตรวจสอบเซิร์ฟเวอร์ SQL ได้อย่างไร
เรามีฐานข้อมูล SQL Server ซึ่งมีข้อกำหนดการตรวจสอบฐานข้อมูลที่ตรวจสอบการดำเนินการทั้งหมดในฐานข้อมูล CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) เราพบว่าแบบสอบถามบางข้อจะเขียนลงในบันทึกการตรวจสอบโดยใช้ฟังก์ชั่นสเกลาร์สำหรับทุกแถวในชุดผลลัพธ์ เมื่อสิ่งนี้เกิดขึ้นบันทึกจะเต็มก่อนที่เราจะสามารถ ETL ลงในที่ซึ่งเป็นสถานที่พักผ่อนขั้นสุดท้ายและเรามีช่องว่างในการบันทึกของเรา น่าเสียดายเนื่องจากเหตุผลด้านความสอดคล้องเราไม่สามารถหยุดการตรวจสอบทุกEXECUTEคำสั่งได้ ความคิดแรกของเราสำหรับแนวทางในการแก้ไขปัญหานี้คือการใช้WHEREข้อในการตรวจสอบเซิร์ฟเวอร์เพื่อกรองกิจกรรม รหัสดูเหมือนว่านี้: WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) น่าเสียดายที่ SQL Server ไม่อนุญาตให้ตัวดำเนินการสัมพันธ์ (อาจเป็นเพราะมันไม่ต้องการสอบถามทุกครั้งที่มีการเขียนไปยังบันทึกการตรวจสอบ) เราต้องการหลีกเลี่ยงการเขียน proc ที่เก็บไว้ซึ่งเป็นรหัสที่ยากobject_idในWHEREข้อ แต่นั่นคือความคิดของเราในปัจจุบันเกี่ยวกับวิธีที่ดีที่สุดในการแก้ไขปัญหานี้ มีวิธีอื่นที่เราควรพิจารณาหรือไม่? เราสังเกตเห็นว่าเมื่อฟังก์ชั่นสเกลาร์ถูกใช้ใน …

3
จำลองฟังก์ชันสเกลาร์ที่ผู้ใช้กำหนดในลักษณะที่ไม่ได้ป้องกันการขนาน
ฉันพยายามดูว่ามีวิธีการหลอกลวง SQL Server ให้ใช้แผนบางอย่างสำหรับแบบสอบถามหรือไม่ 1. สภาพแวดล้อม ลองนึกภาพคุณมีข้อมูลบางอย่างที่ใช้ร่วมกันระหว่างกระบวนการที่แตกต่างกัน สมมติว่าเรามีผลการทดสอบบางอย่างซึ่งใช้พื้นที่มาก จากนั้นสำหรับแต่ละขั้นตอนเรารู้ว่าต้องการใช้ปี / เดือนใด if object_id('dbo.SharedData') is not null drop table SharedData create table dbo.SharedData ( experiment_year int, experiment_month int, rn int, calculated_number int, primary key (experiment_year, experiment_month, rn) ) go ตอนนี้สำหรับทุกกระบวนการเรามีพารามิเตอร์ที่บันทึกไว้ในตาราง if object_id('dbo.Params') is not null drop table dbo.Params create table dbo.Params …

1
ฉันจะบังคับให้ประเมินค่าสเกลาร์ UDF เพียงครั้งเดียวในแบบสอบถามได้อย่างไร
ฉันมีข้อความค้นหาที่ต้องการกรองผลลัพธ์ของสเกลาร์ UDF ต้องส่งเคียวรีเป็นคำสั่งเดียว (ดังนั้นฉันไม่สามารถกำหนดผลลัพธ์ UDF ให้กับตัวแปรโลคอล) และฉันไม่สามารถใช้ TVF ได้ ฉันรับรู้ถึงปัญหาประสิทธิภาพที่เกิดจาก UDF แบบเกลาซึ่งรวมถึงการบังคับให้แผนทั้งหมดทำงานอย่างต่อเนื่องหน่วยความจำที่มากเกินไปปัญหาการประมาณค่าทาง cardinality และการขาด inlining สำหรับคำถามนี้โปรดสมมติว่าฉันต้องใช้สเกลาร์ UDF UDF นั้นค่อนข้างแพงในการโทร แต่ในทางทฤษฎีแล้วแบบสอบถามสามารถนำไปใช้อย่างมีเหตุผลโดยเครื่องมือเพิ่มประสิทธิภาพในลักษณะที่ฟังก์ชันจะต้องคำนวณเพียงครั้งเดียว ฉันล้อเลียนตัวอย่างที่ง่ายมากสำหรับคำถามนี้ แบบสอบถามต่อไปนี้ใช้เวลา 6152 ms ในการดำเนินการบนเครื่องของฉัน: SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); ตัวดำเนินการตัวกรองในแผนแบบสอบถามชี้ให้เห็นว่าฟังก์ชันนั้นถูกประเมินหนึ่งครั้งสำหรับแต่ละแถว: DDL และการเตรียมข้อมูล: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE …

3
วิธีที่เร็วที่สุดในการนับจำนวนช่วงวันที่ครอบคลุมแต่ละวันจากซีรี่ส์
ฉันมีตาราง (ใน PostgreSQL 9.4) ที่มีลักษณะเช่นนี้: CREATE TABLE dates_ranges (kind int, start_date date, end_date date); INSERT INTO dates_ranges VALUES (1, '2018-01-01', '2018-01-31'), (1, '2018-01-01', '2018-01-05'), (1, '2018-01-03', '2018-01-06'), (2, '2018-01-01', '2018-01-01'), (2, '2018-01-01', '2018-01-02'), (3, '2018-01-02', '2018-01-08'), (3, '2018-01-05', '2018-01-10'); ตอนนี้ฉันต้องการคำนวณสำหรับวันที่ที่กำหนดและสำหรับทุกประเภทว่ามีกี่แถวจากdates_rangesแต่ละวันที่ตก อาจตัดศูนย์ได้ ผลลัพธ์ที่ต้องการ: +-------+------------+----+ | kind | as_of_date | n | …

2
มีฟังก์ชัน SQL มาตรฐานที่มีผลข้างเคียงหรือไม่?
มาตรฐาน SQL กำหนดฟังก์ชันที่มีผลข้างเคียงหรือไม่? ตัวอย่างเช่นพวกเขามีฟังก์ชั่นสำหรับการเขียนลงในไฟล์ * หรือเพื่อปรับปรุงค่าในคอลัมน์บางคอลัมน์ของตารางเมื่อคุณทำสิ่งที่ชอบ SELECT myfunction(params...); ฉันเคยเห็นสิ่งเหล่านี้บางครั้ง แต่ฉันแค่อยากรู้ว่ามาตรฐาน SQL ทำเช่นเดียวกัน * นี่ไม่ใช่คำถามเกี่ยวกับ PostgreSQL โดยเฉพาะ ฉันใช้ตัวอย่างผลข้างเคียงที่ฉันเห็นใน PostgreSQL เท่านั้น

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