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

Microsoft SQL Server ทุกรุ่น (ไม่ใช่ MySQL) โปรดเพิ่มแท็กเฉพาะเวอร์ชันเช่น sql-server-2016 เนื่องจากมักเกี่ยวข้องกับคำถาม

1
SQL Spec ต้องการ GROUP BY ใน EXISTS () หรือไม่
Microsoft อนุญาตให้ใช้ไวยากรณ์นี้ในขณะนี้ SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); ขอให้สังเกตว่าไม่มีGROUP BYในEXISTSข้อเป็น ANSI SQL ที่ถูกต้อง หรือเป็นเพียงการเปิดเผยรายละเอียดการปฏิบัติ สำหรับการอ้างอิงไวยากรณ์เดียวกันนี้ไม่ได้รับอนุญาตใน PostgreSQL ข้อผิดพลาด: คอลัมน์ "tx" จะต้องปรากฏในกลุ่มตามข้อหรือจะใช้ในฟังก์ชั่นรวม แต่ไวยากรณ์นี้ได้รับอนุญาต .. SELECT * FROM ( …

1
SQL Server Query Plan XML: ความยาว QueryPlanHash
UPDATE:นี่เป็นข้อผิดพลาดอย่างแน่นอน สำหรับรายละเอียดทั้งหมดดูรายการเชื่อมต่อนี้ ในขณะที่ทดสอบการเปลี่ยนแปลงบางอย่างกับsp_BlitzCache (การเปิดเผยอย่างสมบูรณ์ฉันเป็นหนึ่งในผู้แต่ง) ฉันเจอสิ่งที่ฉันคิดว่าเป็นข้อบกพร่องในรหัสของเรา ณ จุดหนึ่งเรากำลังจับคู่แฮชแผนแบบสอบถามเพื่อรับค่าใช้จ่ายแบบสอบถาม เราทำเช่นนั้นเกี่ยวกับเช่น: statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) = xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float') สิ่งนี้ได้ผลเท่าที่ฉันเคยเห็น อย่างไรก็ตามในกรณีที่แปลกหนึ่งสตริงย่อยใน XML กำลังส่งNULLค่าและแผนแสดงค่า 0 แม้ว่ามันจะค่อนข้างสูง เมื่อขุดเข้าไปในแผนปฏิบัติการ (การเปิดเผยอย่างเต็มรูปแบบฉันทำงานให้กับ บริษัท ที่เป็นเจ้าภาพวางแผน) ฉันสังเกตเห็นว่าแฮชแผนแบบสอบถามสำหรับแฮชปัญหาเดียวมีแฮช 17 ตัวในขณะที่ที่เหลือคือ 18 นี่คือตัวอย่าง: QueryPlanHash = "0x4410B0CA640CDA89" QueryPlanHash = "0x2262FEA4CE645569" QueryPlanHash = "0xED4F225CC0E97E5" - ปัญหา! QueryPlanHash = "0xBF878EEE6DB955EA" QueryPlanHash = "0x263B53BC8C14A452" QueryPlanHash = "0x89F5F146CF4B476F" QueryPlanHash = …

1
ลำดับของคำสั่งใน“ EXISTS (…) หรือ EXISTS (…)”
ฉันมีคลาสของคำถามที่ทดสอบการมีอยู่ของหนึ่งในสองสิ่งนี้ มันเป็นรูปแบบ SELECT CASE WHEN EXISTS (SELECT 1 FROM ...) OR EXISTS (SELECT 1 FROM ...) THEN 1 ELSE 0 END; ข้อความจริงถูกสร้างขึ้นใน C และดำเนินการเป็นแบบสอบถามเฉพาะกิจผ่านการเชื่อมต่อ ODBC เมื่อเร็ว ๆ นี้พบว่า SELECT ที่สองอาจเร็วกว่า SELECT แรกในกรณีส่วนใหญ่และการเปลี่ยนคำสั่งของสองประโยค EXISTS ทำให้เกิดการเร่งความเร็วอย่างมากในกรณีทดสอบที่ไม่เหมาะสมอย่างน้อยหนึ่งกรณีที่เราเพิ่งสร้างขึ้น สิ่งที่ชัดเจนที่ต้องทำคือเดินหน้าต่อไปและสลับสองประโยค แต่ฉันต้องการดูว่ามีคนคุ้นเคยกับ SQL Server มากกว่านี้หรือไม่ รู้สึกเหมือนว่าฉันอาศัยความบังเอิญและ "รายละเอียดการนำไปปฏิบัติ" (ดูเหมือนว่าถ้า SQL Server ฉลาดขึ้นก็จะดำเนินการทั้งสองข้อ EXISTS ในแบบคู่ขนานและปล่อยให้สิ่งใดสิ่งหนึ่งที่ทำให้เกิดการลัดวงจรเป็นครั้งแรก มีวิธีที่ดีกว่าในการทำให้ SQL Server …
11 sql-server 

2
ทำไมการวนซ้ำซ้อนกันจึงสนับสนุนเฉพาะการรวมซ้ายเท่านั้น
ในบล็อกของ Craig Freedman เข้าร่วม Nested Loops Joinเขาอธิบายว่าทำไมการเข้าร่วม loops แบบซ้อนไม่สามารถรองรับการเข้าร่วมด้านนอกที่ถูกต้อง: ปัญหาคือเราสแกนตารางด้านในหลาย ๆ ครั้ง - หนึ่งครั้งสำหรับแต่ละแถวของการรวมภายนอก เราอาจพบแถวภายในเดียวกันหลายครั้งในระหว่างการสแกนหลายครั้ง เราสามารถสรุปได้ว่าจุดภายในแถวใดแถวหนึ่งไม่ได้หรือจะไม่เข้าร่วม? ใครช่วยอธิบายสิ่งนี้ด้วยวิธีที่ง่ายและให้ความรู้ได้จริงหรือ? หมายความว่าการวนรอบเริ่มต้นด้วยตารางด้านนอก ( R1) และการสแกนด้านใน ( R2) หรือไม่ ฉันเข้าใจว่าสำหรับR1ค่าที่ไม่ได้เข้าร่วมR2ควรแทนที่ด้วยNULLชุดผลลัพธ์จึงกลายเป็น ( NULL, R2) สำหรับฉันดูเหมือนว่าเป็นไปไม่ได้ที่จะคืนR2ค่าเมื่อR1ไม่ได้เข้าร่วมด้วยเหตุผลที่ไม่สามารถรู้ว่าR2จะคืนค่าใด แต่นั่นไม่ใช่วิธีที่อธิบาย หรือมันคืออะไร? ในความเป็นจริง SQL Server จะปรับให้เหมาะสม (และมักจะแทนที่) RIGHT JOINด้วยLEFT JOINแต่คำถามคือเพื่ออธิบายว่าทำไมมันเป็นไปไม่ได้ทางเทคนิคสำหรับตรรกะNESTED LOOPS JOINการใช้งาน / การสนับสนุนRIGHT JOIN

2
วิธีการอ่านโค้ด HTML เป็น XML และรับผลเช่นเดียวกับตัวอย่างใน sql?
ฉันมีรหัส HTML เก็บไว้ในฐานข้อมูลและฉันต้องการอ่านมันเป็น XML รหัสของฉัน: http://rextester.com/RMEHO89992 นี่คือตัวอย่างของรหัส HTML ที่ฉันมี: <div> <section> <h4> <span> A </span> </h4> <ul> <li> <span> Ab</span> AD <span> AC </span> </li> <li> <span> Ag</span> <span> AL </span> </li> </ul> <h4> <span> B </span> </h4> <ul> <li> <span> Bb</span> BD <span> BC </span> </li> <li> <span> Bg</span> …
11 sql-server  t-sql  xml 

2
SQL Server tempdb บนดิสก์ RAM หรือไม่
ฐานข้อมูลแอปพลิเคชันผู้ขายของเรานั้นเข้มงวดมาก TempDB เซิร์ฟเวอร์เป็นเสมือน (VMWare) ที่มี 40 คอร์และ RAM 768GB โดยใช้ SQL 2012 Enterprise SP3 ฐานข้อมูลทั้งหมดรวมถึง TempDB อยู่ใน Tier 1 SSD ใน SAN เรามีไฟล์ข้อมูล tempdb 10 ไฟล์แต่ละไฟล์มีขนาด 1GB และมีการเติบโตอัตโนมัติ เช่นเดียวกันกับไฟล์บันทึก 70GB มีการตั้งค่าค่าสถานะการสืบค้นกลับ 1117 & 1118 แล้ว sys.dm_io_virtual_file_stats แสดงมากกว่า 50 Terabytes อ่าน / เขียนข้อมูล tempdb & ล็อกไฟล์ในเดือนที่ผ่านมาโดยมี io_stall สะสม 250 ชั่วโมงหรือ 10 …

2
เมื่อแปลงไดนามิก SQL (เคียวรี pivot) ไปยังเอาต์พุต xml ทำไมตัวเลขแรกของวันที่ถูกแปลงเป็นยูนิโคด
ฉันใช้ตัวอย่างที่ยอดเยี่ยมนี้/dba//a/25818/113298จาก Bluefeet เพื่อสร้างเดือยและเปลี่ยนเป็นข้อมูล xml ประกาศพารามิเตอร์ DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); ถัดไปคือ CTE ที่มีรหัสจำนวนมาก endresult ของ CTE จะถูกใส่ใน temp DB (เช่นเดียวกับในตัวอย่าง) SELECT B.[StayDate] -- this is a date dd-mm-yyyy , B.[Guid] INTO #tempDates FROM BaseSelection B การสร้าง cols (เช่นเดียวกับตัวอย่าง) SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120)) …
11 sql-server  xml  pivot 

3
เป็นไปได้หรือไม่ที่จะเลือก RAISERROR หรือ THROW ขึ้นอยู่กับรุ่นของ SQL Server
นี่คือรหัสของฉันตอนนี้: BEGIN TRY INSERT INTO TABLE (F1,F2,F3) VALUES ('1','2','3') END TRY BEGIN CATCH ;THROW END CATCH ใช้งานได้ดีเว้นแต่ว่ามันจะทำงานบนเครื่องที่มี SQL 2008 ฉันต้องการให้ CATCH block ทำการตรวจสอบกับเวอร์ชันของ SQL และเรียกใช้ THROW ถ้ามันเท่ากับหรือสูงกว่าถึง 2012 และ RAISERROR ถ้าเป็น 2008 ฉันจะทำงานต่อไป ข้อผิดพลาดทางไวยากรณ์และฉันสงสัยว่ามันเป็นไปได้ แม้แต่สิ่งที่เรียบง่ายเช่นนี้ก็ไม่ได้ผลสำหรับฉัน BEGIN CATCH IF ((SELECT SERVERPROPERTY('productversion')) >= 11) ;THROW END CATCH คำแนะนำใด ๆ ที่ชื่นชม

1
ตรวจสอบข้อ จำกัด ในการบังคับใช้ ###. ###. #### จับคู่รูปแบบ
ฉันต้องการตรวจสอบข้อ จำกัด ที่บังคับใช้รูปแบบ regex นี้สำหรับรหัสหลายส่วน: ^\d{3}\.\d{3}\.\d{4}$ ... สามตัวเลข, จุด, สามตัวเลข, จุด, สี่ตัวเลข ฉันต้องสร้างฟังก์ชัน CLR เพื่อบังคับใช้การจับคู่รูปแบบหรือไม่และสามารถอ้างอิงฟังก์ชัน CLR ใน DDL ได้หรือไม่ มีวิธีในการบังคับใช้รูปแบบในอีกทางหนึ่งโดยใช้LIKEหรือไม่

2
SQL Server - คอลัมน์ NTEXT และการจัดการสตริง
ฉันมีตารางที่มีNTEXTคอลัมน์ชื่อcommentsหนึ่ง ฉันมีสตริงที่สองขอเรียกว่าanothercomment(กvarchar) ที่ความต้องการวางภายในที่กำหนดสตริงหลังคำว่าcommentsUPDATEHERE กำลังส่งเพื่อnvarchar(max)ตัดทอนcommentsสตริงดังนั้นฉันจึงไม่สามารถใช้ไลค์ของCHARINDEX()( Msg 8152, Level 16, State 10, Line 2 String or binary data would be truncated.). ฉันเคยdatalength()ตรวจสอบว่ามีคอลัมน์สองสามพันคอลัมน์ที่มี> 8000 ตัวอักษร ตัวอย่างของสิ่งที่ฉันต้องการบรรลุ (แม้ว่าจะมีสตริงที่ยาวกว่า): ความคิดเห็น - This is a test UPDATEHERE This is the end of the test ความคิดเห็นอื่น - . This is inserted. สตริงผลลัพธ์ - This is a test …

4
จำนวนตัวแปรท้องถิ่นที่สามารถมีส่วนร่วมในการดำเนินงานของตลาดหลักทรัพย์สูงสุดคือเท่าไร
ฉันมีขั้นตอนการจัดเก็บที่มีตรรกะทางธุรกิจ ข้างในนั้นฉันมีตัวแปรประมาณ 1609 (อย่าถามฉันว่าทำไมนี่คือวิธีการทำงานของเครื่องยนต์) ฉันพยายามSETตัวแปรหนึ่งตัวต่อค่าที่เชื่อมโยงกันของตัวแปรอื่นทั้งหมด เป็นผลในระหว่างการสร้างฉันได้รับข้อผิดพลาด: ข่าวสารเกี่ยวกับ 8631, ระดับ 17, สถานะ 1, กระบวนงาน XXX, บรรทัด YYY ข้อผิดพลาดภายใน: ถึงขีด จำกัด สแต็กเซิร์ฟเวอร์แล้ว โปรดค้นหาการซ้อนที่อาจเกิดขึ้นในแบบสอบถามของคุณและพยายามทำให้มันง่ายขึ้น ฉันพบว่าข้อผิดพลาดเกิดจากจำนวนตัวแปรที่ฉันต้องใช้ในการSETดำเนินการ ฉันสามารถทำงานที่มอบหมายโดยแยกออกเป็นสองส่วน คำถามของฉันมีข้อ จำกัด บางประการในเรื่องนี้หรือไม่? ฉันตรวจสอบแล้ว แต่ไม่พบสิ่งใด เราตรวจสอบข้อผิดพลาดที่อธิบายในKBนี้ แต่นี่ไม่ใช่กรณีของเรา เราไม่ใช้CASEการแสดงออกใด ๆภายในรหัสของเรา เราใช้ตัวแปรชั่วคราวนั้นเพื่อเตรียมรายการค่าที่ต้องถูกแทนที่โดยใช้ฟังก์ชัน CLR เราอัปเดต SQL Server เป็น SP3 CU6 (รุ่นล่าสุด) แต่เรายังคงพบข้อผิดพลาด

1
SQL Server จัดเก็บการตั้งชื่อกระบวนงาน
[16_TestStoredProc]เราได้เริ่มต้นการตั้งชื่อวิธีการจัดเก็บของเราเป็น มีความหมายใด ๆ ที่ตั้งชื่อขั้นตอนการจัดเก็บเช่นนี้หรือไม่? ฉันจะไม่อธิบายว่าทำไมเราจึงทำเช่นนี้ ไม่ใช่ว่าฉันมีปัญหากับเรื่องนี้ แต่จะมีความหมายใด ๆ

10
วิธีสร้างซีรีย์ 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, ... ใน SQL มาตรฐานหรือ T-SQL
ด้วยตัวเลขสองตัวnและmฉันต้องการสร้างชุดของแบบฟอร์ม 1, 2, ..., (n-1), n, n, (n-1), ... 2, 1 และทำซ้ำmครั้ง ตัวอย่างเช่นสำหรับn = 3และm = 4ฉันต้องการลำดับหมายเลข 24 ต่อไปนี้: 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 ---------------- ---------------- ---------------- ---------------- ฉันรู้วิธีการบรรลุผลลัพธ์นี้ใน PostgreSQL โดยวิธีใดวิธีหนึ่งจากสองวิธี: …

1
ดัชนีใดที่จะใช้ในสถานการณ์นี้
SQL Server 2014 Standard Edition ฉันต้องการค้นหาจำนวนเที่ยวบินที่ไปและกลับจากบางเมืองในบางเดือน เช่น select count(*) from flights where flightTo_AirportCode = 'aaaa' and flightFrom_Airportcode = 'bbbb' and flightdate < '2016-04-01' and flightdate > '2016-02-28' ; ตารางสคีมาอยู่ด้านล่าง ฉันพยายามที่จะประเมินว่าดัชนี modelA หรือ index modelB (ด้านล่าง) เป็นที่นิยมหรือไม่ (ใช้เวลาหลายชั่วโมงในการสร้างดัชนีและพื้นที่ดิสก์อนุญาตให้มีอยู่ครั้งละหนึ่งรายการเท่านั้นดังนั้นฉันจึงพยายามมองก่อนที่จะกระโดด) จากประสบการณ์ของฉันทั้งดัชนีจะทำ ฉันถูกไหม? create index [modelA] on flights (flightTo_AirportCode, flightFrom_AirportCode, flightDate) create index [modelB] …

2
พฤติกรรมการรวมของสตรีม
ค้นหา: declare @X xml = ' <item ID = "0"/> <item ID = "1"/> <item/> <item/>'; select I.X.value('@ID', 'int') from @X.nodes('/item') as I(X); ผลลัพธ์: ----------- 0 1 NULL NULL แผนการดำเนินการ: สาขาด้านบน shreds XML IDเพื่อสี่แถวและสาขาด้านล่างเรียกค่าสำหรับแอตทริบิวต์ สิ่งที่ทำให้ฉันแปลกประหลาดคือจำนวนแถวที่คืนจากผู้ดำเนินการรวมสตรีม แถว 2 ที่มาจากตัวกรองคือIDแอตทริบิวต์จากitemโหนดแรกและโหนดที่สองใน XML สตรีมรวมจะส่งคืนสี่แถวหนึ่งแถวสำหรับแต่ละแถวป้อนเปลี่ยนการเข้าร่วมด้านในเป็นการรวมภายนอกได้อย่างมีประสิทธิภาพ นี่คือบางสิ่งที่ Stream Aggregate ทำในสถานการณ์อื่นเช่นกันหรือเป็นเพียงสิ่งแปลก ๆ ที่เกิดขึ้นเมื่อทำการค้นหา XML ฉันไม่สามารถเห็นคำแนะนำใด ๆ ในแผนการสืบค้นเวอร์ชัน …

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