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

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

4
มีวิธีสร้างตารางสร้างสคริปต์ใน TSQL หรือไม่?
มีวิธีสร้างสคริปต์สร้างจากตารางที่มีอยู่ใน T-SQL (โดยไม่ใช้ SMO เนื่องจาก T-SQL ไม่สามารถเข้าถึง SMO ได้) สมมติว่าเป็นกระบวนงานที่เก็บไว้ที่รับชื่อตารางและส่งคืนสตริงที่มีสคริปต์สร้างสำหรับตารางที่กำหนดหรือไม่ ตอนนี้ให้ฉันอธิบายสถานการณ์ที่ฉันกำลังเผชิญเนื่องจากอาจมีวิธีอื่นในการเข้าถึงสิ่งนี้ ฉันมีอินสแตนซ์ที่มีฐานข้อมูลหลายโหล ฐานข้อมูลเหล่านี้ทั้งหมดมีสคีมาเหมือนกันทั้งหมดตารางเดียวกันดัชนีและอื่น ๆ พวกเขาถูกสร้างขึ้นเป็นส่วนหนึ่งของการติดตั้งซอฟต์แวร์บุคคลที่สาม ฉันต้องมีวิธีในการทำงานกับพวกเขาเพื่อให้ฉันสามารถรวบรวมข้อมูลจากพวกเขาในลักษณะเฉพาะกิจ ผู้คนที่ดีที่ dba.se ได้ช่วยฉันที่นี่แล้วจะสร้างทริกเกอร์ในฐานข้อมูลอื่นได้อย่างไร ขณะนี้ฉันต้องการค้นหาวิธีการเลือกจากตารางในฐานข้อมูลทั้งหมด ฉันได้บันทึกชื่อฐานข้อมูลทั้งหมดลงในตารางที่เรียกDatabaseesและฉันเขียนสคริปต์ต่อไปนี้เพื่อดำเนินการคำสั่งที่เลือกในพวกเขาทั้งหมด: IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp select * into #tmp from Database1.dbo.Table1 where 1=0 DECLARE @statement nvarchar(max) = N'insert into #tmp select * from Table1 where Column1=0 …

4
จำกัด ผลลัพธ์ให้อยู่ในแถวที่ 2 อันดับแรก
ใน SQL Server 2008 ฉันใช้เพื่อกลับชุดข้อมูลที่มีRANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC) RANKแต่ฉันมีหลายร้อยเร็กคอร์ดสำหรับแต่ละพาร์ติชันดังนั้นฉันจะได้รับค่าจากอันดับ 1, 2, 3 ...... 999 แต่ฉันต้องการได้มากถึง 2 RANKsในแต่ละPARTITIONครั้ง ตัวอย่าง: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 …

6
การฉีด SQL Server - ความเสียหายเท่าไหร่ใน 26 ตัวอักษร?
ฉันกำลังทดสอบความยืดหยุ่นจากการโจมตีของการฉีดในฐานข้อมูล SQL Server ชื่อตารางในฐานข้อมูลเป็นกรณีที่ต่ำกว่าและการเปรียบเทียบเป็นกรณีที่มีความไวLatin1_General_CS_AS สตริงที่ฉันสามารถส่งถูกบังคับให้พิมพ์ใหญ่และสามารถมีความยาวสูงสุด 26 อักขระ ดังนั้นฉันไม่สามารถส่งเป็นตาราง DROP ได้เนื่องจากชื่อตารางจะเป็นตัวพิมพ์ใหญ่และดังนั้นคำสั่งจะล้มเหลวเนื่องจากการเปรียบเทียบ ดังนั้น - ความเสียหายสูงสุดที่ฉันสามารถทำได้ใน 26 ตัวละครคืออะไร? แก้ไข ฉันรู้ทั้งหมดเกี่ยวกับข้อความค้นหาที่กำหนดพารามิเตอร์และอื่น ๆ - ลองจินตนาการว่าบุคคลที่พัฒนาส่วนหน้าที่สร้างคิวรีเพื่อส่งไม่ได้ใช้พารามิเตอร์ในกรณีนี้ ฉันยังไม่ได้พยายามทำอะไรชั่วร้ายนี่เป็นระบบที่สร้างโดยคนอื่นในองค์กรเดียวกัน

1
ฉันควรเพิ่ม SET NOCOUNT ON ให้กับตัวกระตุ้นทั้งหมดของฉันหรือไม่?
เป็นความรู้ทั่วไปที่คุณควรมี SET NOCOUNT ON โดยค่าเริ่มต้นเมื่อสร้างขั้นตอนการจัดเก็บใหม่ Microsoft ได้เปลี่ยนเทมเพลตเริ่มต้นเพื่อรวมสิ่งนี้ในปี 2012 ฉันคิดว่านี่จะเป็นสิ่งเดียวกันสำหรับทริกเกอร์ แต่ก็ไม่ได้รวมอยู่ในเทมเพลต มันเป็นความตั้งใจหรือเป็นเพียงการกำกับดูแล?

2
เลือกระเบียนทั้งหมดเข้าร่วมกับตาราง A หากมีอยู่แล้วเข้าร่วมตาราง B ถ้าไม่ใช่
ดังนั้นนี่คือสถานการณ์ของฉัน: ฉันทำงาน Localization สำหรับโครงการของฉันและโดยทั่วไปฉันจะทำเช่นนี้ในรหัส C # แต่ฉันต้องการทำเช่นนี้ใน SQL อีกเล็กน้อยตั้งแต่ฉันพยายามควัก SQL เล็กน้อย สภาพแวดล้อม: มาตรฐาน SQL Server 2014, C # (.NET 4.5.1) หมายเหตุ: ภาษาการเขียนโปรแกรมควรไม่เกี่ยวข้องฉันเพียง แต่รวมไว้เพื่อความสมบูรณ์เท่านั้น ดังนั้นฉันจึงประสบความสำเร็จในสิ่งที่ฉันต้องการ แต่ไม่เท่าที่ฉันต้องการ จะได้รับในขณะที่ (อย่างน้อยปี) ตั้งแต่ผมได้กระทำใด ๆ SQL JOINs JOINยกเว้นคนพื้นฐานและนี้ค่อนข้างซับซ้อน นี่คือ diagramme ของตารางที่เกี่ยวข้องของฐานข้อมูล (มีอีกมากมาย แต่ไม่จำเป็นสำหรับส่วนนี้) ความสัมพันธ์ทั้งหมดที่อธิบายในภาพเสร็จสมบูรณ์ในฐานข้อมูล - PKและFKข้อ จำกัด คือการตั้งค่าและการใช้งานทั้งหมด ไม่มีคอลัมน์ใดที่อธิบายnullได้ dboตารางทั้งหมดมีแบบแผน ตอนนี้ฉันมีคำถามที่เกือบจะทำสิ่งที่ฉันต้องการ: นั่นคือให้ใด ๆจากรหัสSupportCategoriesและรหัสใด ๆของLanguagesมันก็จะกลับมาอย่างใดอย่างหนึ่ง: หากมีการแปลขวาที่เหมาะสมสำหรับภาษานั้นสำหรับสตริงที่ (IE …

4
การเลือกอัลกอริทึมที่เหมาะสมในฟังก์ชัน HashBytes
เราจำเป็นต้องสร้างค่าแฮชของข้อมูล nvarchar เพื่อการเปรียบเทียบ มีอัลกอริทึมแฮชหลายอย่างใน T-SQL แต่มีวิธีไหนที่ดีที่สุดในการเลือกจากสถานการณ์นี้ เราต้องการให้มั่นใจว่าความเสี่ยงของการมีค่าแฮชที่ซ้ำกันสำหรับค่า nvarchar ที่ต่างกันสองค่านั้นเป็นขั้นต่ำ จากการวิจัยของฉันทางอินเทอร์เน็ต MD5 นั้นดีที่สุด นั่นถูกต้องใช่ไหม? MSDN บอกเรา (ลิงค์ด้านล่าง) เกี่ยวกับอัลกอริธึมที่มีอยู่ แต่ไม่มีคำอธิบายใดเกี่ยวกับเงื่อนไขใดบ้าง HASHBYTES (Transact-SQL) เราจำเป็นต้องเข้าร่วมสองตารางในสองคอลัมน์ nvarchar (สูงสุด) ในขณะที่คุณสามารถจินตนาการแบบสอบถามใช้เวลาในการดำเนินการ เราคิดว่าจะเป็นการดีกว่าที่จะเก็บค่าแฮชของข้อมูล nvarchar (สูงสุด) แต่ละรายการและทำการรวมเข้ากับค่าแฮชมากกว่าค่า nvarchar (สูงสุด) ซึ่งเป็น blobs คำถามคืออัลกอริธึมแฮชใดที่ให้ความแตกต่างดังนั้นเราจึงไม่เสี่ยงต่อการมีค่าแฮชหนึ่งค่าสำหรับมากกว่าหนึ่ง nvarchar (สูงสุด)

6
SQL Server รองรับ GREATEST และ LEAST หรือไม่หากไม่ใช่วิธีแก้ไขปัญหาทั่วไป
การตรวจสอบคำถามนี้ดูเหมือนว่าเป็นงานที่ไม่ควรทำ พวกเขากำลังพยายามขยายช่วงด้วยวันที่ ในฐานข้อมูลอื่นคุณจะใช้greatestและleast.. least(extendDate,min), greatest(extendDate,max) เมื่อฉันพยายามใช้สิ่งเหล่านี้ฉันก็จะได้ 'least' is not a recognized built-in function name. 'greatest' is not a recognized built-in function name. ที่จะครอบคลุมนามสกุลในทิศทางใดทิศทางหนึ่ง สำหรับวัตถุประสงค์ของคำถามคุณยังคงต้องทำการเปลี่ยนช่วงพิเศษ ฉันแค่สงสัยว่าผู้ใช้ SQL Server ใช้รูปแบบแบบสอบถามเพื่อเลียนแบบleastและการgreatestทำงานได้อย่างไร PostgreSQL GREATEST/LEAST MySQL GREATEST/LEAST MariaDB GREATEST LEAST DB2 GREATEST LEAST คำพยากรณ์ GREATEST LEAST คุณคลายเงื่อนไขลงในCASEข้อความสั่งหรือมีส่วนเสริม, โปรแกรมเสริมของบุคคลภายนอกหรือใบอนุญาตจาก Microsoft ที่เปิดใช้งานฟังก์ชันนี้หรือไม่?

3
ตัวระบุที่ไม่ซ้ำกับอักขระพิเศษที่ยังจับคู่ในการเลือก
เรากำลังใช้ SQL Server 2012 ด้วยตัวระบุที่ไม่ซ้ำกันและเราสังเกตว่าเมื่อทำการเลือกด้วยอักขระเพิ่มเติมที่เพิ่มเข้ามาในตอนท้าย (ไม่ใช่ 36 ตัวอักษร) มันยังคงส่งคืนการจับคู่กับ UUID ตัวอย่างเช่น: select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' ส่งกลับแถวที่มี 7DA26ECB-D599-4469-91D4-F9136EC0B4E8uuid แต่ถ้าคุณวิ่ง: select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS' ก็ยังส่งกลับแถวที่มี 7DA26ECB-D599-4469-91D4-F9136EC0B4E8uuid SQL Server ดูเหมือนจะไม่สนใจอักขระทั้งหมดที่เกิน 36 เมื่อทำการเลือก นี่เป็นข้อบกพร่อง / คุณสมบัติหรือสิ่งที่สามารถกำหนดค่าได้หรือไม่? มันไม่ได้เป็นปัญหาใหญ่เท่าที่เรามีการตรวจสอบในส่วนหน้าสำหรับความยาว แต่ดูเหมือนว่าพฤติกรรมที่ไม่ถูกต้องสำหรับฉัน


5
สร้างคำแนะนำแผนเพื่อแคช (ผลการสปูลขี้เกียจ) CTE
ปกติแล้วฉันจะสร้างคำแนะนำแผนโดยการสร้างแบบสอบถามที่ใช้แผนที่ถูกต้องและคัดลอกไปยังแบบสอบถามที่คล้ายกันซึ่งไม่ได้ อย่างไรก็ตามบางครั้งก็เป็นเรื่องยากโดยเฉพาะอย่างยิ่งหากแบบสอบถามไม่เหมือนกันทั้งหมด วิธีที่ถูกต้องในการสร้างคำแนะนำแผนคืออะไร? SQLKiwi ได้กล่าวถึงการร่างแผนใน SSIS มีวิธีหรือเครื่องมือที่มีประโยชน์เพื่อช่วยในการจัดทำแผนดีสำหรับ SQL Server หรือไม่? ตัวอย่างที่เป็นปัญหาคือ CTE: SQLFiddle with cte(guid,other) as ( select newid(),1 union all select newid(),2 union all select newid(),3) select a.guid, a.other, b.guid guidb, b.other otherb from cte a cross join cte b order by a.other, b.other; มีวิธีใดบ้างที่จะทำให้ผลลัพธ์นั้นมี 3 guids ที่แตกต่างกันและไม่มีอีกต่อไป? ฉันหวังว่าจะสามารถตอบคำถามได้ดีขึ้นในอนาคตโดยรวมถึงคำแนะนำแผนกับแบบสอบถามชนิด …
19 sql-server  t-sql  cte 

2
ไม่สามารถอัปเดต“ CO2” เป็น“ CO₂” ในแถวตาราง
รับตารางนี้: CREATE TABLE test ( id INT NOT NULL, description NVARCHAR(100) COLLATE Modern_Spanish_CI_AS NOT NULL ); INSERT INTO test (id, description) VALUES (1, 'CO2'); ฉันรู้ว่าฉันไม่สามารถแก้ไขปัญหาเกี่ยวกับการพิมพ์ได้: SELECT * FROM test WHERE id = 1; UPDATE test SET description = 'CO₂' WHERE id = 1; SELECT * FROM test WHERE id = …

2
ข้อ จำกัด ค่าเริ่มต้นคุ้มค่าหรือไม่
ฉันมักจะออกแบบฐานข้อมูลตามกฎต่อไปนี้: ไม่มีใครอื่นนอกจาก db_owner และดูแลระบบสามารถเข้าถึงตารางฐานข้อมูล บทบาทของผู้ใช้จะถูกควบคุมที่ชั้นแอปพลิเคชัน ฉันมักจะใช้บทบาท db หนึ่งรายการเพื่อให้สิทธิ์เข้าถึงมุมมองโพรซีเดอร์และฟังก์ชันที่เก็บไว้ แต่ในบางกรณีฉันเพิ่มกฎที่สองเพื่อปกป้องโพรซีเดอร์ที่เก็บไว้บางส่วน ฉันใช้ TRIGGERS เพื่อตรวจสอบข้อมูลที่สำคัญในขั้นต้น CREATE TRIGGER <TriggerName> ON <MyTable> [BEFORE | AFTER] INSERT AS IF EXISTS (SELECT 1 FROM inserted WHERE Field1 <> <some_initial_value> OR Field2 <> <other_initial_value>) BEGIN UPDATE MyTable SET Field1 = <some_initial_value>, Field2 = <other_initial_value> ... END DML ดำเนินการโดยใช้กระบวนงานที่เก็บไว้: …

2
คำถามเกี่ยวกับประสิทธิภาพของ "SELECT TOP"
ฉันมีข้อความค้นหาที่ทำงานเร็วขึ้นมากเมื่อเลือกtop 100และช้ากว่าโดยไม่top 100เลือก จำนวนระเบียนที่ส่งคืนคือ 0 คุณสามารถอธิบายความแตกต่างในแผนคิวรีหรือแชร์ลิงก์ที่อธิบายความแตกต่างดังกล่าวได้หรือไม่ แบบสอบถามที่ไม่มีtopข้อความ: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; แผนแบบสอบถามสำหรับข้างต้น (ไม่รวมtop): https://pastebin.com/cbtJpxFf สถิติ IO และ TIME (ไม่รวมtop): SQL Server …

4
ทำไมฉันไม่สามารถใช้ตัวแปรใน T-SQL เหมือนที่ฉันจินตนาการได้
ยกโทษให้ฉันฉันเป็นนักพัฒนาที่ได้ย้ายไปยังโลกของ SQL ฉันคิดว่าฉันสามารถปรับปรุง SQL ด้วยการเพิ่มตัวแปร แต่มันไม่ทำงานเหมือนที่ฉันคาดไว้ มีใครบอกฉันได้ไหมว่าทำไมสิ่งนี้ถึงใช้งานไม่ได้ ฉันไม่ต้องการทำงานฉันต้องการทราบเหตุผลว่าทำไมมันถึงใช้งานไม่ได้ฉันคิดว่ามันควรจะเป็นเพราะฉันแน่ใจว่ามีเหตุผลที่ดี DECLARE @DatabaseName varchar(150) SET @DatabaseName = 'MyAmazingDatabaseName' CREATE DATABASE @DatabaseName GO USE @DatabaseName GO

2
ประสิทธิภาพการเลื่อนหน้าด้วยการเรียงลำดับที่กำหนดเองได้หลายล้านแถว
ในแอปพลิเคชันของเราเรามีตารางที่ผู้ใช้สามารถเลื่อนดูระเบียนจำนวนมาก (10-20 ล้าน) กริดรองรับการเรียงลำดับจากน้อยไปมากและจากมากไปน้อยในคอลัมน์จำนวนมาก (20+) ค่าจำนวนมากยังไม่ซ้ำกันดังนั้นแอปพลิเคชันจึงเรียงลำดับตาม id เป็นตัวแบ่งไทม์เบรกเพื่อให้แน่ใจว่าแถวปรากฏบนหน้าเดียวกันเสมอ ตัวอย่างเช่นหากผู้ใช้ต้องการเรียงลำดับตามขนาดวิดเจ็ต (เริ่มต้นที่ใหญ่ที่สุด) แอปพลิเคชันจะสร้างคิวรีที่มีลักษณะดังนี้: SELECT TOP 30 * -- (Pretend that there is a list of columns here) FROM Test -- WHERE widgetSize > 100 ORDER BY widgetSize DESC, id ASC เคียวรีนี้ใช้เวลา ~ 15s ในการรัน (ด้วยข้อมูลที่แคช) ค่าใช้จ่ายส่วนใหญ่ดูเหมือนจะเรียงลำดับแถว ~ 1.3m โดย widgetSize ในความพยายามที่จะปรับแต่งแบบสอบถามนี้ฉันค้นพบว่าถ้าฉันเพิ่มในWHEREประโยคที่ จำกัด …

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