คำถามติดแท็ก t-sql

Transact-SQL (T-SQL) เป็นภาษาถิ่นของ SQL ที่ใช้โดย Microsoft SQL Server และ Sybase ของ SAP

2
ฉันจะตัดอักขระที่ไม่ใช่ตัวเลขออกจากสตริงได้อย่างไร
ผู้ใช้ป้อนคำค้นหาในกล่องและค่านั้นจะถูกส่งผ่านไปยังขั้นตอนการจัดเก็บและตรวจสอบกับเขตข้อมูลที่แตกต่างกันไม่กี่ในฐานข้อมูล ฟิลด์เหล่านี้ไม่ได้เป็นชนิดข้อมูลเดียวกันเสมอไป หนึ่งฟิลด์ (หมายเลขโทรศัพท์) ประกอบด้วยตัวเลขทั้งหมดดังนั้นเมื่อตรวจสอบจะตัดอักขระที่ไม่ใช่ตัวเลขทั้งหมดออกจากสตริงโดยใช้ฟังก์ชัน. Net CLR SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '') ปัญหาคือฟังก์ชั่นนี้หยุดทำงานทันทีที่มีข้อผิดพลาดดังต่อไปนี้: ข่าวสารเกี่ยวกับ 6533, ระดับ 16, สถานะ 49, บรรทัด 2 AppDomain MyDBName.dbo [runtime] .1575 ถูกยกเลิกการโหลดโดยนโยบายการเลื่อนระดับเพื่อให้แน่ใจว่า ความสอดคล้องของใบสมัครของคุณ หน่วยความจำไม่เพียงพอเกิดขึ้นขณะเข้าถึงทรัพยากรที่สำคัญ System.Threading.ThreadAbortException: ข้อยกเว้นชนิด 'System.Threading.ThreadAbortException' ถูกส่งไป System.Threading.ThreadAbortException: ฉันลองคำแนะนำที่โพสต์บนMSDNสำหรับข้อผิดพลาดนี้ แต่ฉันยังคงพบปัญหา ในขณะนี้การสลับไปใช้เซิร์ฟเวอร์ 64 บิตไม่ใช่ตัวเลือกสำหรับเรา ฉันรู้ว่าการรีสตาร์ทเซิร์ฟเวอร์จะปล่อยหน่วยความจำใด ๆ ก็ตาม แต่นั่นไม่ใช่วิธีแก้ปัญหาที่ใช้งานได้ในสภาพแวดล้อมการใช้งานจริง มีวิธีการแยกอักขระที่ไม่ใช่ตัวเลขออกจากสตริงใน SQL Server 2005 โดยใช้ T-SQL เท่านั้นหรือไม่

5
ฟังก์ชัน SQL ตารางที่มีค่าเพื่อแยกคอลัมน์บนเครื่องหมายจุลภาค
ฉันเขียน Table Valued Function ใน Microsoft SQL Server 2008 เพื่อใช้คอลัมน์คั่นด้วยเครื่องหมายจุลภาคในฐานข้อมูลเพื่อแยกแถวที่แยกออกสำหรับแต่ละค่า เช่น: "หนึ่งสองสามสี่" จะส่งคืนตารางใหม่โดยมีเพียงหนึ่งคอลัมน์ที่มีค่าต่อไปนี้: one two three four รหัสนี้มีข้อผิดพลาดเกิดขึ้นกับคุณหรือเปล่า? เมื่อฉันทดสอบด้วย SELECT * FROM utvf_Split('one,two,three,four',',') มันวิ่งไปตลอดกาลและจะไม่ส่งคืนสิ่งใดเลย นี่เป็นสิ่งที่ทำให้ท้อใจโดยเฉพาะอย่างยิ่งเนื่องจากไม่มีฟังก์ชั่นแยกในเซิร์ฟเวอร์ MSSQL (ทำไมเพราะอะไร?!) และฟังก์ชั่นที่คล้ายกันทั้งหมดที่ฉันพบบนเว็บเป็นถังขยะแน่นอนหรือไม่เกี่ยวข้องกับสิ่งที่ฉันพยายามทำ . นี่คือฟังก์ชั่น: USE *myDBname* GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[utvf_SPlit] (@String VARCHAR(MAX), @delimiter CHAR) RETURNS @SplitValues …

3
ประสิทธิภาพ TSQL - เข้าร่วมกับมูลค่าระหว่างต่ำสุดและสูงสุด
ฉันมีสองตารางที่ฉันเก็บ: ช่วง IP - ตารางการค้นหาประเทศ รายการคำขอมาจาก IP ที่ต่างกัน IP ถูกเก็บไว้เป็นbigints เพื่อปรับปรุงประสิทธิภาพการค้นหา นี่คือโครงสร้างของตาราง: create table [dbo].[ip2country]( [begin_ip] [varchar](15) NOT NULL, [end_ip] [varchar](15) NOT NULL, [begin_num] [bigint] NOT NULL, [end_num] [bigint] NOT NULL, [IDCountry] [int] NULL, constraint [PK_ip2country] PRIMARY KEY CLUSTERED ( [begin_num] ASC, [end_num] ASC ) ) create table Request( Id …

2
มีวิธีใดที่จะบังคับให้มีการแก้ไขชื่อรอการตัดบัญชีแม้ว่าตารางจะมีอยู่เมื่อสร้างกระบวนงานที่เก็บไว้?
เมื่อสร้างโพรซีเดอร์ที่เก็บไว้ใน SQL Server คุณจะได้รับอนุญาตให้อ้างถึงตารางที่ไม่มีอยู่ แต่ถ้าตารางนั้นมีอยู่คอลัมน์ใด ๆ ที่คุณอ้างถึงในขั้นตอนต้องมีอยู่ในตารางนั้น ( การแก้ปัญหาชื่อที่เลื่อนออกไป ) เป็นไปได้หรือไม่ที่จะสั่งให้ SQL Server เลื่อนการจำแนกชื่อของตารางทั้งหมดที่อ้างอิงในกระบวนการโดยไม่คำนึงว่ามีอยู่จริงหรือไม่? ฉันต้องการเก็บการตรวจสอบไวยากรณ์ทั่วไปดังนั้นแม้ว่าจะเป็นไปได้แฮ็คการนิยามโพรซีเดอร์ที่เก็บไว้ในตารางระบบไม่ใช่ตัวเลือก ฉันคาดหวังว่าการขอทำสิ่งนี้อาจจะดูแปลก ๆดังนั้นนี่คือพื้นหลัง: ฉันสร้างคำจำกัดความของตารางโดยอัตโนมัติและขั้นตอนการจัดเก็บจากแอปพลิเคชันที่เขียนใน C # และมันยากมากสำหรับฉันที่จะเปลี่ยนรหัส พวกเขา รหัสของฉัน "รับประกัน" ว่าสคีมานั้นสอดคล้องกันในการทำธุรกรรม แต่ในปัจจุบันฉันไม่สามารถรับประกันได้ว่าจะมีการกำหนดคอลัมน์ตารางก่อนที่ฉันจะกำหนดขั้นตอนการจัดเก็บซึ่งอ้างอิงพวกเขา ด้านล่างเป็นตัวอย่างที่ยอมรับได้ของ SQL ที่สร้างขึ้นโดย C # ซึ่ง "อธิบาย" ปัญหาที่ฉันพยายามแก้ไข --Say this table already exists. CREATE TABLE myTable ( a NVARCHAR(MAX) ) GO --My C# code …

5
ตัวเลขเฉพาะในช่วงที่กำหนด
เมื่อเร็ว ๆ นี้ฉันได้รับมอบหมายให้พิมพ์หมายเลขเฉพาะทั้งหมด (1-100) ฉันล้มเหลวอย่างมากที่นั่น รหัสของฉัน: Create Procedure PrintPrimeNumbers @startnum int, @endnum int AS BEGIN Declare @a INT; Declare @i INT = 1 ( Select a = @startnum / 2; WHILE @i<@a BEGIN @startnum%(@a-@i) i=i+1; ) END แม้ว่าฉันจะลงเอยโดยไม่ทำให้เสร็จ แต่ฉันก็สงสัยว่าเป็นไปได้หรือไม่ที่จะทำโปรแกรมเช่นนั้นบนฐานข้อมูล (SQL Server 2008 R2) ถ้าใช่มันจะจบได้อย่างไร

1
วิธีหลีกเลี่ยงการใช้แบบสอบถามแบบผสานเมื่อทำซ้ำหลายข้อมูลโดยใช้พารามิเตอร์ xml
ฉันกำลังพยายามอัปเดตตารางด้วยอาร์เรย์ของค่าต่างๆ แต่ละรายการในอาร์เรย์มีข้อมูลที่ตรงกับแถวในตารางในฐานข้อมูล SQL Server หากแถวนั้นมีอยู่แล้วในตารางเราจะอัปเดตแถวนั้นด้วยข้อมูลในอาร์เรย์ที่กำหนด มิฉะนั้นเราจะแทรกแถวใหม่ในตาราง ฉันได้อธิบายโดยทั่วไปเพิ่มขึ้น ตอนนี้ฉันกำลังพยายามทำให้สำเร็จในโพรซีเดอร์ที่เก็บไว้ซึ่งใช้พารามิเตอร์ XML เหตุผลที่ฉันใช้ XML และไม่ใช่พารามิเตอร์ที่มีค่าเป็นตารางเนื่องจากฉันจะต้องสร้างประเภทที่กำหนดเองใน SQL และเชื่อมโยงประเภทนี้กับกระบวนงานที่เก็บไว้ หากฉันเปลี่ยนบางสิ่งบางอย่างในขั้นตอนการจัดเก็บหรือ db schema ของฉันลงที่ถนนฉันจะต้องทำซ้ำทั้งขั้นตอนการจัดเก็บและประเภทที่กำหนดเอง ฉันต้องการหลีกเลี่ยงสถานการณ์นี้ นอกจากนี้ความเหนือกว่าที่ TVP มีเหนือ XML ไม่มีประโยชน์สำหรับสถานการณ์ของฉันเพราะขนาดอาร์เรย์ข้อมูลของฉันจะไม่เกิน 1,000 ซึ่งหมายความว่าฉันไม่สามารถใช้โซลูชันที่เสนอที่นี่: วิธีแทรกหลายระเบียนโดยใช้ XML ใน SQL Server 2008 นอกจากนี้ยังมีการอภิปรายที่คล้ายกันที่นี่ ( UPSERT - มีทางเลือกที่ดีกว่าสำหรับ MERGE หรือ @@ rowcount หรือไม่ ) แตกต่างจากที่ฉันขอเพราะฉันพยายามเพิ่มหลายแถวไปยังตาราง ฉันหวังว่าฉันจะใช้ชุดคำสั่งต่อไปนี้เพื่อเพิ่มค่าจาก xml แต่นี่จะไม่ทำงาน วิธีการนี้ควรทำงานเมื่ออินพุตเป็นแถวเดียว begin tran …

1
รับการบันทึกขั้นต่ำเมื่อโหลดข้อมูลลงในตารางชั่วคราว
แม้หลังจากอ่านคู่มือการโหลดข้อมูลฉันยังคงไม่แน่ใจว่าจำเป็นต้องเพิ่มตาราง TABLOCK คำใบ้ลงในตารางชั่วคราวที่ว่างเปล่าซึ่งกำหนดด้วยดัชนีคลัสเตอร์เพื่อรับการบันทึกขั้นต่ำ เห็นได้ชัดว่าตาราง temp นั้นสร้างขึ้นใน TempDB ซึ่งทำงานในโหมดการกู้คืนแบบง่ายดังนั้นฉันจึงคิดว่ามันเป็นตัวเลือกที่สมบูรณ์แบบสำหรับการบันทึกที่น้อยที่สุด แต่ฉันไม่สามารถหาข้อความเพื่อยืนยันได้ เป็นตารางชั่วคราวที่เป็นตัวเลือกสำหรับการบันทึกขั้นต่ำและถ้าเป็นเช่นนั้นมันก็คุ้มที่จะเพิ่ม TABLOCK hint ตามที่แนะนำสำหรับตารางถาวรหรือไม่

2
การดำเนินการแตกต่างสมมาตรใน Transact-SQL?
ฉันได้รู้จักกันเสมอเกี่ยวกับUNIONผู้ประกอบการใน SQL แต่เมื่อเร็ว ๆ นี้พบว่ามีผู้ประกอบการชุดอื่น ๆและINTERSECT EXCEPTฉันไม่สามารถค้นหาผู้ดำเนินการที่ดำเนินการชุดใหญ่ชุดที่สี่ความแตกต่างแบบสมมาตร (เช่นตรงข้ามกับINTERSECT) ดูเหมือนว่าฉันจะได้รับผลลัพธ์ที่ต้องการโดยใช้สิ่งที่ชอบ SELECT Field FROM A UNION SELECT Field FROM B EXCEPT SELECT Field FROM A INTERSECT SELECT Field FROM B (สมมติว่าฉันมีสิทธิ์เหนือกว่า) หรือด้วยการเข้าร่วมต่อต้านแบบเต็ม: SELECT A.Field, B.Field FROM A FULL JOIN B ON B.Id = A.Id WHERE B.Id IS NULL OR A.Id IS NULL …
10 sql-server  t-sql 

1
ฟังก์ชั่นเพื่อรับอินพุตอักขระและรูปแบบวันที่ส่งคืน (ที่มีอินพุตไม่ถูกต้อง)
ฉันต้องเขียนฟังก์ชั่นเพื่อรับตัวอักษรสตริงและกลับรูปแบบวันที่ ตัวอย่างเช่นการป้อนข้อมูลคือ 20120101 และฉันต้องการสิ่งนี้ 2012-01-01 ปัญหาคืออาจมีอินพุตที่ไม่ถูกต้องเช่น "2012ABCD" นี้ ในกรณีนั้นฉันต้องการให้ฟังก์ชันส่งคืนวันที่ที่แน่นอนเช่น 2020-01-01 สิ่งที่ฉันเขียนจนถึงตอนนี้คือ: Create Function ReturnDate (@date varchar(8)) Returns date as begin declare @result date set @result = (select convert(date , @date,111)) if(@@ROWCOUNT>0) return @result else return '2020-01-01' return @result end ไม่ทำงานและฉันไม่รู้วิธีจัดการส่วนที่สอง (เมื่ออินพุตไม่ถูกต้อง)

1
สำหรับเอาต์พุต xml path ('')
เมื่อฉันเรียกใช้ต่อไปนี้ select t.type from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') ฉันได้รับผลลัพธ์นี้ <type>Green</type> <type>Blue</type> <type>Red</type> ถ้าฉันเรียกใช้ต่อไปนี้ select t.type + '/' from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') ฉันได้รับผลลัพธ์นี้ Green/Blue/Red/ เหตุใดการเพิ่มการต่อข้อมูลในตัวเลือกที่นำไปสู่การลบแท็กประเภทและเอาต์พุตในหนึ่งบรรทัดในไฟล์ xml ใช้ SQL Server 2012

3
ทริกเกอร์ T-SQL เป็นวิธีที่ทำให้เกิดการเปลี่ยนแปลงที่เกิดขึ้นจริงเท่านั้น?
ฉันมีตารางทริกเกอร์ใน UPDATE และ INSERTที่เพิ่มแถวไปยังตารางอื่น จะต้องเพิ่มแถวต่อเมื่อมีการเปลี่ยนแปลงหนึ่งในสี่คอลัมน์ ฉันลองใช้ IF UPDATE (col) เพื่อทดสอบการเปลี่ยนแปลง แต่มีจุดบอด แค่ทดสอบว่ามีค่าบางอย่างเข้ามาฉันต้องไปให้ลึกกว่านี้ฉันต้องเปรียบเทียบค่าเก่ากับค่าใหม่เพื่อดูการเปลี่ยนแปลงที่แท้จริงเกิดขึ้น มันต้องทำงานกับทั้ง INSERT และ UPDATE ในกรณีของ UPDATE นั้นง่ายเพราะทั้งตารางที่ถูกแทรกและถูกลบมีค่าที่ฉันสามารถเปรียบเทียบได้ภายในทริกเกอร์ อย่างไรก็ตามสำหรับ INSERT เฉพาะตารางแทรกเท่านั้นที่มีค่า เพราะฉันต้องการทั้งหมดนี้ในทริกเกอร์เดียวกันฉันจะจัดการกรณี INSERT ได้อย่างไร นี่คือสคริปต์ของทริกเกอร์ที่ฉันต้องการแก้ไข: ALTER TRIGGER [dbo].[trATPerson_alter] ON [mydb].[dbo].[AT_Person] AFTER INSERT,UPDATE AS BEGIN SET NOCOUNT ON; -- Not all updates require a push IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR …
9 t-sql  trigger 

3
เหตุใดแบบสอบถามนี้จึงไม่มีส่วนคำสั่ง FROM ไม่ใช่ข้อผิดพลาด
ดังนั้นเราจึงมีแบบสอบถามที่มีคิวรีย่อยที่มีการพิมพ์ผิดอยู่ มันหายไปจากอนุประโยค แต่เมื่อคุณเรียกใช้มันไม่ผิดพลาด! ทำไม!? SELECT 1 ,r.id ,'0D4133BE-C1B5-4141-AFAD-B171A2CCCE56' ,GETDATE() ,1 ,'Y' ,'N' ,oldItem.can_view ,oldItem.can_update FROM Role r JOIN RoleObject oldReport ON r.customer_id = oldReport.customer_id JOIN RoleItem oldItem ON oldReport.id = oldItem.role_object_id AND r.id = oldItem.role_id WHERE r.id NOT IN (SELECT role_id WHERE role_object_id = '0D4133BE-C1B5-4141-AFAD-B171A2CCCE56') AND oldReport.id = '169BA22F-1614-4EBA-AF45-18E333C54C6C'

5
จับคู่ a] (ปิดวงเล็บเหลี่ยม) กับ PATINDEX โดยใช้สัญลักษณ์“ []”
ผมเขียนเอง JSON parser ใน T-SQL † สำหรับวัตถุประสงค์ในการแยกวิเคราะห์ฉันใช้PATINDEXฟังก์ชันที่คำนวณตำแหน่งของโทเค็นจากรายการโทเค็น โทเค็นในกรณีของฉันเป็นอักขระเดี่ยวทั้งหมดและรวมไว้ด้วย: {} []:, โดยปกติเมื่อฉันต้องการค้นหาตำแหน่ง (แรก) ของตัวละครที่กำหนดหลายตัวฉันจะใช้PATINDEXฟังก์ชั่นดังนี้: PATINDEX('%[abc]%', SourceString) ฟังก์ชั่นแล้วจะให้ฉันตำแหน่งแรกของaหรือbหรือc- SourceStringแล้วแต่จำนวนใดจะเกิดขึ้นจะพบแรก ตอนนี้ปัญหาในกรณีของฉันดูเหมือนจะเชื่อมต่อกับ]ตัวละคร ทันทีที่ฉันระบุไว้ในรายการตัวละครเช่นนี้ PATINDEX('%[[]{}:,]%', SourceString) ดูเหมือนว่ารูปแบบที่ฉันตั้งใจไว้จะพังเพราะฟังก์ชั่นไม่เคยพบคู่ที่ตรงกัน ดูเหมือนว่าฉันต้องการวิธีที่จะหลบหนีแรก]เพื่อให้PATINDEXถือว่าเป็นหนึ่งในตัวละครการค้นหามากกว่าสัญลักษณ์พิเศษ ฉันพบคำถามนี้ถามเกี่ยวกับปัญหาที่คล้ายกัน: ต้องการความช่วยเหลือกับตัวดำเนินการ LIKE และวงเล็บเหลี่ยม อย่างไรก็ตามในกรณีนั้น]ก็ไม่จำเป็นต้องระบุในวงเล็บเพราะมันเป็นเพียงหนึ่งตัวละครและมันสามารถระบุได้โดยไม่ต้องวงเล็บรอบพวกเขา โซลูชันทางเลือกซึ่งใช้การหลบหลีกใช้งานได้เฉพาะLIKEและไม่ได้ใช้PATINDEXเพราะใช้การย่อยESCAPEด้วยการสนับสนุนจากอดีตและไม่ใช่อย่างหลัง ดังนั้นคำถามของฉันคือมีวิธีการค้นหา]ด้วยการPATINDEXใช้[ ]สัญลักษณ์แทนหรือไม่ หรือมีวิธีจำลองการทำงานโดยใช้เครื่องมือ Transact-SQL อื่น ๆ หรือไม่? ข้อมูลเพิ่มเติม นี่คือตัวอย่างของแบบสอบถามที่ฉันต้องการใช้PATINDEXกับ[…]รูปแบบดังกล่าวข้างต้น รูปแบบที่นี่ใช้งานได้ (แม้ว่าจะค่อนข้าง ) เพราะมันไม่ได้รวม]ตัวละคร ฉันต้องการที่จะทำงานด้วย]เช่นกัน: WITH data AS (SELECT CAST('{"f1":["v1","v2"],"f2":"v3"}' AS varchar(max)) …

4
ฉันจะเพิ่มการอ่านหลังจากที่ได้ทำรายการระดับการยุติการทำรายการแล้วหรือไม่?
ภายในโพรซีเดอร์ที่เก็บฉันมีดังต่อไปนี้: (sql server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH เนื่องจากนี่คือธุรกรรมตามความคิดของฉันคือการเชื่อมต่อฐานข้อมูลส่วนที่เหลือจะไม่ได้รับผลกระทบจาก SERIALIZABLE ฉันต้องตั้งระดับการแยกโดยปริยายเพื่ออ่านความมุ่งมั่นหลังจากที่ส่งมอบหรือไม่? สิ่งนี้จะส่งผลกระทบต่อการเชื่อมต่ออื่น ๆ ระหว่างแอพพลิเคชันเซิร์ฟเวอร์และเซิร์ฟเวอร์ฐานข้อมูลของฉันหรือไม่

2
sp_msforeachdb ทำงานอย่างไรเบื้องหลัง?
ฉันต้องการแก้ไขปัญหาที่ฉันมีและต้องการความช่วยเหลือในการทำความเข้าใจวิธีการทำงานของ sp_msforeachdb เพื่อที่จะเอาชนะปัญหาของฉัน สิ่งที่เกิดขึ้นคือทุกครั้งที่ฉันเรียกใช้ sp_msforeachdb ฉันจะได้รับข้อผิดพลาด Msg 102, Level 15, State 1, Incorrect syntax near '61' ตัวอย่างของรหัสของฉันเป็นดังนี้: EXEC SP_msforeachdb 'SELECT ''?'' AS Database FROM ?.sys.objects WHERE name like ''%aetna%'' อย่างไรก็ตามมันไม่สำคัญว่าเคียวรีใดที่ฉันมีเป็นพารามิเตอร์สำหรับ sp_msforeachdb ทุกครั้งที่ฉันได้รับข้อผิดพลาดเดียวกัน ฉันมีฐานข้อมูลที่ขึ้นต้นด้วย '61s1d' ดังนั้นฉันคิดว่ามันมีปัญหากับชื่อ DB แต่โดยสุจริตฉันไม่รู้ว่าเกิดอะไรขึ้นเบื้องหลังของ sp_msforeachdb สิ่งที่ควรทราบ มันเป็นฐานข้อมูลเดียวที่เริ่มต้นด้วยตัวเลข ฉันสามารถลองใช้รหัสเช่น "ถ้าฐานข้อมูลเป็น '% 61%' อย่าทำ ...... " แต่ก็ยังมีข้อผิดพลาดเดียวกัน ฉันไม่สามารถทดสอบการเปลี่ยนชื่อฐานข้อมูล - …

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