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

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

2
สร้างดัชนีหากไม่มีอยู่
ฉันกำลังทำงานกับฟังก์ชั่นที่อนุญาตให้ฉันเพิ่มดัชนีหากไม่มีอยู่ ฉันพบปัญหาที่ฉันไม่สามารถรับรายการดัชนีเพื่อเปรียบเทียบได้ ความคิดใด ๆ นี่เป็นปัญหาที่คล้ายคลึงกับการสร้างคอลัมน์ที่แก้ไขด้วยรหัสนี้: https://stackoverflow.com/a/12603892/368511

2
วิธีการเข้าร่วมตารางที่มีฟังก์ชั่นมูลค่าตาราง?
ฉันมีฟังก์ชั่นที่ผู้ใช้กำหนด: create function ut_FooFunc(@fooID bigint, @anotherParam tinyint) returns @tbl Table (Field1 int, Field2 varchar(100)) as begin -- blah blah end ตอนนี้ฉันต้องการเข้าร่วมในตารางอื่นเช่น: select f.ID, f.Desc, u.Field1, u.Field2 from Foo f join ut_FooFunc(f.ID, 1) u -- doesn't work where f.SomeCriterion = 1 ในคำอื่น ๆ สำหรับทุกFooระเบียนที่SomeCriterion1 ผมต้องการที่จะเห็นFoo IDและDescควบคู่ไปกับค่าของField1และField2ที่กลับมาจากการสำหรับการป้อนข้อมูลของut_FooFuncFoo.ID ไวยากรณ์ที่จะทำคืออะไร?

1
มีประโยชน์ใด ๆ ในการกำหนดฟังก์ชั่นที่นอกเหนือจาก Halloween Protection หรือไม่?
เป็นที่ทราบกันดีว่าSCHEMABINDINGฟังก์ชั่นสามารถหลีกเลี่ยงสปูลที่ไม่จำเป็นในแผนการอัพเดทได้: หากคุณใช้ UDF แบบ T-SQL แบบง่ายที่ไม่ได้แตะตารางใด ๆ (เช่นไม่เข้าถึงข้อมูล) ตรวจสอบให้แน่ใจว่าคุณระบุSCHEMABINDINGตัวเลือกระหว่างการสร้าง UDF สิ่งนี้จะทำให้ UDFs schema-bound และตรวจสอบให้แน่ใจว่าเคียวรีเครื่องมือเพิ่มประสิทธิภาพจะไม่สร้างตัวดำเนินการสปูลที่ไม่จำเป็นสำหรับแผนแบบสอบถามที่เกี่ยวข้องกับ UDF เหล่านี้ มีข้อได้เปรียบอื่น ๆ ของSCHEMABINDINGฟังก์ชั่นแม้ว่าจะไม่สามารถเข้าถึงข้อมูลได้หรือไม่?

1
การฉีด SQL ในฟังก์ชัน Postgres กับเคียวรีที่เตรียมไว้
ใน Postgres แบบสอบถามที่เตรียมไว้และฟังก์ชั่นที่ผู้ใช้กำหนดเองนั้นเทียบเท่ากับกลไกในการป้องกันการฉีด SQLหรือไม่ มีข้อดีโดยเฉพาะอย่างยิ่งในแนวทางหนึ่งมากกว่าอีกวิธีหนึ่งหรือไม่?

2
มีวิธีการป้องกันไม่ให้ Scalar UDFs ในคอลัมน์ที่คำนวณได้จากการยับยั้งความเท่าเทียมกันหรือไม่?
มีการเขียนมากมายเกี่ยวกับภัยของ Scalar UDFใน SQL Server การค้นหาทั่วไปจะส่งคืนผลลัพธ์จำนวนมาก มีสถานที่บางแห่งที่ Scalar UDF เป็นตัวเลือกเท่านั้น เป็นตัวอย่าง: เมื่อจัดการกับ XML: XQuery ไม่สามารถใช้เป็นข้อกำหนดคอลัมน์ที่คำนวณได้ ทางเลือกหนึ่งที่มีการบันทึกโดย Microsoft คือการใช้Scalar UDFเพื่อแค็ปซูล XQuery ของคุณใน Scalar UDF จากนั้นใช้ในคอลัมน์ที่คำนวณ สิ่งนี้มีเอฟเฟกต์ต่าง ๆ และวิธีแก้ปัญหาบางอย่าง ดำเนินการทีละแถวเมื่อมีการสอบถามตาราง บังคับให้คิวรีทั้งหมดกับตารางทำงานแบบอนุกรม คุณสามารถหลีกเลี่ยงการประมวลผลแบบแถวต่อแถวได้โดยการกำหนดฟังก์ชันและคงคอลัมน์ที่คำนวณไว้หรือสร้างดัชนี ไม่มีวิธีใดที่สามารถป้องกันการบังคับให้ลำดับของเคียวรีที่กดปุ่มตารางแม้ว่าสเกลาร์ UDF ไม่ได้ถูกอ้างอิง มีวิธีที่รู้จักกันในการทำเช่นนั้น?

1
แปลงระเบียนคอลัมน์ทั้งหมดเป็นตัวพิมพ์เล็ก
ฉันใช้ PostgreSQL 9.1 และฉันมีตารางผู้ใช้ที่มีloginคอลัมน์ ชื่อล็อกอินเป็นกรณี ๆ ไปเช่น Bob, MikE, john ฉันต้องการแปลงระเบียนทั้งหมดเหล่านี้เป็นตัวพิมพ์เล็ก ฉันจะทำสิ่งนั้นได้อย่างไร

1
ฟังก์ชัน Postgres จะกำหนดผลลัพธ์ของแบบสอบถามให้กับตัวแปรหลายตัว
ฉันต้องการกำหนดค่าให้กับตัวแปร 2 ตัวดังต่อไปนี้ในฟังก์ชัน Postgres a := select col1 from tbl where ... b := select col2 from tbl where ... ฉันจะกำหนด 2 ค่าให้กับ 2 ตัวแปรในคำสั่งหนึ่งบรรทัดได้อย่างไร ชอบ a,b := select col1,col2 from tbl where ...

2
เหตุใดฟังก์ชัน LEN () จึงประเมินค่าความสำคัญต่ำใน SQL Server 2014
ฉันมีตารางที่มีคอลัมน์สตริงและเพรดิเคตที่ตรวจสอบแถวที่มีความยาวแน่นอน ใน SQL Server 2014 ฉันเห็นการประมาณ 1 แถวโดยไม่คำนึงถึงความยาวที่ฉันกำลังตรวจสอบ นี่เป็นแผนที่แย่มากเพราะมีหลายพันหรือหลายล้านแถวและ SQL Server เลือกที่จะวางตารางนี้ไว้ที่ด้านนอกของลูปที่ซ้อนกัน มีคำอธิบายสำหรับการประมาณค่า cardinality ที่ 1.0003 สำหรับ SQL Server 2014 หรือไม่ในขณะที่ SQL Server 2012 ประมาณ 31,622 แถว มีวิธีแก้ปัญหาที่ดีหรือไม่? นี่คือการทำซ้ำสั้น ๆ ของปัญหา: -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT …

1
ฟังก์ชันการซ้อนฟังก์ชันสเกลาร์อ้างอิงตนเองด้วยตนเองเกินเมื่อเพิ่มการเลือก
วัตถุประสงค์ เมื่อพยายามสร้างตัวอย่างทดสอบของฟังก์ชันการอ้างอิงตนเองรุ่นหนึ่งล้มเหลวในขณะที่อีกรุ่นหนึ่งประสบความสำเร็จ ความแตกต่างเพียงอย่างเดียวคือการเพิ่มSELECTให้กับส่วนของฟังก์ชันทำให้แผนการดำเนินการแตกต่างกันสำหรับทั้งสอง ฟังก์ชั่นที่ใช้งานได้ CREATE FUNCTION dbo.test5(@i int) RETURNS INT AS BEGIN RETURN( SELECT TOP 1 CASE WHEN @i = 1 THEN 1 WHEN @i = 2 THEN 2 WHEN @i = 3 THEN dbo.test5(1) + dbo.test5(2) END ) END; กำลังเรียกใช้ฟังก์ชัน SELECT dbo.test5(3); ผลตอบแทน (No column name) 3 ฟังก์ชั่นที่ไม่ทำงาน CREATE …

9
ทดสอบว่าสตริงเป็น palindrome โดยใช้ T-SQL
ฉันเป็นผู้เริ่มต้นใน T-SQL ฉันต้องการตัดสินใจว่าสตริงอินพุตเป็น palindrome โดยมีเอาต์พุต = 0 หากไม่ใช่และ output = 1 หากเป็น ฉันยังคงหาไวยากรณ์ ฉันไม่ได้รับข้อความแสดงข้อผิดพลาด ฉันกำลังมองหาวิธีแก้ไขปัญหาที่แตกต่างกันและข้อเสนอแนะบางอย่างเพื่อให้ได้ความเข้าใจและความรู้ที่ดีขึ้นเกี่ยวกับวิธีการทำงานของ T-SQL เพื่อให้ทำงานได้ดีขึ้น - ฉันยังเป็นนักเรียนอยู่ ความคิดหลักที่ฉันเห็นคือการเปรียบเทียบอักขระซ้าย - ขวา - ส่วนใหญ่กับแต่ละอื่น ๆ เพื่อตรวจสอบความเท่าเทียมกันจากนั้นไปเปรียบเทียบอักขระที่สองจากด้านซ้ายกับอักขระ 2 จากซ้ายและสุดท้าย เราวนซ้ำ: ถ้าตัวละครมีค่าเท่ากันเราจะดำเนินการต่อ ถ้าเราถึงจุดสิ้นสุดเราจะเอาท์พุท 1 ถ้าไม่เราก็เอาท์พุท 0 คุณช่วยวิจารณ์ได้ไหม: CREATE function Palindrome( @String Char , @StringLength Int , @n Int , @Palindrome BIN , …

3
วิธีการให้สิทธิ์ในฟังก์ชันที่มีค่าเป็นตาราง
ฉันทำถูกแล้ว ... ฉันมีฟังก์ชั่นที่คืนเงิน ... CREATE FUNCTION functionName( @a_principal money, @a_from_date datetime, @a_to_date datetime, @a_rate float ) RETURNS money AS BEGIN DECLARE @v_dint money set @v_dint = computation_here set @v_dint = round(@v_dint, 2) RETURN @v_dint END GO Grant execute on functionName to another_user Go ฉันแค่สงสัยว่ามันเป็นไปได้ที่จะถูกแปลงเป็น iTVF หรือไม่? ฉันพยายามทำสิ่งนี้ แต่ฉันพบข้อผิดพลาด: CREATE FUNCTION …

3
ใน PostgreSQL มีฟังก์ชั่นรวมที่ปลอดภัยชนิดแรก () หรือไม่?
คำถามแบบเต็มเขียนใหม่ ฉันกำลังมองหาฟังก์ชันการรวมครั้งแรก () ที่นี่ฉันพบบางสิ่งที่เกือบจะได้ผล: CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement ) RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT $1; $$; -- And then wrap an aggregate around it CREATE AGGREGATE public.first ( sfunc = public.first_agg, basetype = anyelement, stype = anyelement ); ปัญหาคือเมื่อคอลัมน์ varchar (n) ผ่านฟังก์ชั่นแรก …

1
SQL Server - การจัดการการแปลสตริงในที่ซ้อนกันแบบ non-deterministic
ในขณะทำโปรไฟล์ฐานข้อมูลฉันพบว่ามีการอ้างอิงฟังก์ชั่นที่ไม่ได้กำหนดค่าบางอย่างที่เข้าถึง1,000-2500 ครั้งต่อนาทีสำหรับการเชื่อมต่อแต่ละครั้งในแอพพลิเคชั่นนี้ วิSELECTจากมุมมองทำให้แผนการดำเนินการต่อไปนี้: ดูเหมือนว่าแผนซับซ้อนสำหรับมุมมองที่มีน้อยกว่าหนึ่งพันแถวที่อาจเห็นการเปลี่ยนแปลงหนึ่งหรือสองแถวทุกสองสามเดือน แต่มันก็แย่ลงด้วยการปฏิบัติอื่น ๆ ดังต่อไปนี้: มุมมองแบบซ้อนไม่สามารถกำหนดค่าได้ดังนั้นเราจึงไม่สามารถจัดทำดัชนีได้ แต่ละมุมมองอ้างอิงหลายUDFs เพื่อสร้างสตริง UDF แต่ละอันประกอบด้วยUDFs ที่ซ้อนกันเพื่อรับรหัส ISO สำหรับภาษาที่แปลเป็นภาษาท้องถิ่น ผู้ชมในกองกำลังใช้เพิ่มเติมสร้างสตริงกลับมาจากUDFการเป็นJOINภาค มุมมองสแต็กแต่ละครั้งจะถือว่าเป็นตารางหมายความว่ามีINSERT/ UPDATE/ DELETEทริกเกอร์ในแต่ละเพื่อเขียนไปยังตารางพื้นฐาน ทริกเกอร์เหล่านี้ในมุมมองใช้CURSORSว่าEXECวิธีการจัดเก็บที่อ้างอิงมากกว่านี้สตริงสร้างUDFs ดูเหมือนว่าฉันจะเน่าเสีย แต่ฉันมีประสบการณ์กับ TSQL เพียงไม่กี่ปี มันจะดีขึ้นเช่นกัน! ดูเหมือนนักพัฒนาที่ตัดสินใจว่านี่เป็นความคิดที่ยอดเยี่ยมทำทั้งหมดนี้เพื่อให้สตริงสองสามร้อยรายการที่เก็บไว้สามารถมีการแปลตามสตริงที่ส่งคืนจากสตริงUDFนั้นเป็นแบบเฉพาะสคีมา นี่คือหนึ่งในมุมมองในสแต็ก แต่ทั้งหมดนั้นไม่ดีเท่ากัน: CREATE VIEW [UserWKStringI18N] AS SELECT b.WKType, b.WKIndex , CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.I18NString ELSE il.I18nString END AS WKString ,CASE …

2
กระทำจำเป็นหลังจากการดำเนินการ DML ในฟังก์ชั่น / ขั้นตอนหรือไม่?
ฉันสงสัยว่าถ้าจำเป็นต้องเขียนคอมมิทหลังจากใส่ / ลบ / อัพเดทในฟังก์ชั่น / ขั้นตอนหรือไม่ ตัวอย่าง: create or replace function test_fun return number is begin delete from a; return 0; end; หรือขั้นตอน create or replace procedure aud_clear_pro as begin delete from a; end; มันจำเป็นต้องกระทำหลังจากลบ? ไม่เข้าใจสถานการณ์ต่อไปนี้: ถ้าฉันเรียก function / procedure จากหน้าต่าง SQL มันต้องยอมรับ แต่ หากฉันกำหนดเวลาฟังก์ชั่น / ขั้นตอนโดยใช้ dbms_scheduler และเรียกใช้งานคำสั่งลบจะถูกส่งโดยอัตโนมัติ …

1
ไวยากรณ์นี้ทำงานอย่างไร {fn CurDate ()} หรือ {fn Now ()} ฯลฯ
เมื่อเร็ว ๆ นี้ฉันได้ดูกระบวนการที่เก็บไว้ค่อนข้างเก่าที่เขียนขึ้นสำหรับ SQL Server 2005 และฉันสังเกตเห็นสิ่งที่ฉันไม่เข้าใจ ดูเหมือนจะเป็นการเรียกใช้ฟังก์ชันบางประเภท ตัวอย่าง: SELECT o.name, o.type_desc, o.create_date FROM sys.objects o WHERE o.create_date < {fn Now()} -1; สิ่งนี้จะแสดงแถวทั้งหมดจากsys.objectsที่มีcreate_dateก่อนหน้า 24 ชั่วโมงที่ผ่านมา ถ้าฉันแสดงแผนการดำเนินการสำหรับแบบสอบถามนี้ฉันเห็นว่า{fn Now()}ถูกแทนที่ด้วยgetdate()โปรแกรมฐานข้อมูล: SELECT [o].[name],[o].[type_desc],[o].[create_date] FROM [sys].[objects] [o] WHERE [o].[create_date]<(getdate()-@1) เห็นได้ชัดว่าใช้อยู่ไกลป้านมากกว่า{fn Now()} GetDate()ฉันหนึ่งจะหลีกเลี่ยงไวยากรณ์นี้เช่นกาฬโรคเพราะมันไม่มีเอกสาร

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