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

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

1
ไวยากรณ์ของ INNER JOIN ซ้อนอยู่ภายใน OUTER JOIN เปรียบเทียบกับผลการสืบค้น
TLDR; หากคุณดูที่แผนปฏิบัติการ 2 แบบมีคำตอบที่ง่ายกว่ากันหรือไม่? ฉันไม่ได้ตั้งใจสร้างดัชนีเพื่อให้ง่ายต่อการดูว่าเกิดอะไรขึ้น การติดตามคำถามก่อนหน้าของฉันที่เราพบความแตกต่างของประสิทธิภาพการค้นหาระหว่างสไตล์การเข้าร่วมที่แตกต่างกัน (เช่นซ้อนกับดั้งเดิม) ฉันได้ตระหนักว่าไวยากรณ์ที่ซ้อนกันยังปรับเปลี่ยนพฤติกรรมของแบบสอบถาม พิจารณา 2 แบบสอบถามต่อไปนี้ SELECT a.*, m.*, n.* FROM dbo.Autos a LEFT JOIN dbo.Models m JOIN dbo.Manufacturers n -- <-- Nested INNER JOIN ON n.ManufacturerID = m.ManufacturerID ON m.ModelID = a.ModelID สิ่งนี้ไม่จำเป็นต้องทำให้ผู้ผลิตเข้าร่วมเพื่อรวมแถว auto กับ ModelID ที่ไม่ได้อยู่ในตาราง Models การใช้ไวยากรณ์แบบดั้งเดิมเราต้องเปลี่ยนการเข้าร่วมเป็นผู้ผลิตเป็นการรวมภายนอกเช่น ... แต่สิ่งนี้เปลี่ยนแผนแบบสอบถาม SELECT a.*, m.*, …

2
ข้อผิดพลาดในการเปลี่ยนความเป็นเจ้าของฐานข้อมูลจากหน้าไฟล์ในกล่องโต้ตอบคุณสมบัติฐานข้อมูล
ฉันกู้คืนฐานข้อมูลและสร้างผู้ใช้ใหม่ (ผู้ใช้เดียวกันกับที่ฉันเข้าสู่ระบบ) เป็น db_owner ตอนนี้เมื่อฉันต้องการดูแผนภาพฐานข้อมูลมีข้อผิดพลาด ไม่สามารถติดตั้งวัตถุการสนับสนุนไดอะแกรมฐานข้อมูลได้เนื่องจากฐานข้อมูลนี้ไม่มีเจ้าของที่ถูกต้อง หากต้องการดำเนินการต่อให้ใช้ไฟล์หน้าแรกของกล่องโต้ตอบคุณสมบัติฐานข้อมูลหรือคำสั่งแก้ไขการอนุญาตเพื่อตั้งค่าเจ้าของฐานข้อมูลให้เข้าสู่ระบบที่ถูกต้องจากนั้นเพิ่มวัตถุสนับสนุนฐานข้อมูล ตอนนี้เมื่อฉันพยายามเปลี่ยนความเป็นเจ้าของจากหน้าไฟล์ของคุณสมบัติฐานข้อมูลฉันได้รับข้อผิดพลาดเป็น ตั้งเจ้าของไม่สำเร็จสำหรับฐานข้อมูล 'ABC' (Microsoft.SqlServer.SMO) ข้อมูลเพิ่มเติม: มีข้อยกเว้นเกิดขึ้นใน SMO เจ้าของฐานข้อมูลใหม่ที่เสนอ James-PC \ James ถูกแมปในฐานะผู้ใช้ James ในฐานข้อมูลนี้ ชื่อพารามิเตอร์: James-PC \ James " โปรดช่วยฉันแก้ไขปัญหาเพื่อให้ฉันสามารถดูไดอะแกรมฐานข้อมูลบนคอมพิวเตอร์เครื่องนี้หลังจากกู้คืนข้อมูลสำรองฐานข้อมูลจากระบบอื่น

2
แบ่ง DBCC CHECKDB ในช่วงหลายวัน
ฉันทำงานเกี่ยวกับการใช้วิธีการของ Paul Randal ในการกระจาย DBCC CHECKDB ด้วยตนเองไปหลายวันสำหรับฐานข้อมูลขนาดใหญ่มากซึ่งโดยทั่วไปประกอบด้วย: การแบ่งตารางในฐานข้อมูลอย่างคร่าว ๆ ระหว่าง 7 ถังข้อมูล รัน DBCC CHECKALLOC สองครั้งต่อสัปดาห์ รัน DBCC CHECKCATALOG สัปดาห์ละครั้ง รัน DBCC CHECKTABLE ในหนึ่งถังในแต่ละวันของสัปดาห์ มีใครใช้เทคนิคนี้หรือไม่? สคริปต์ที่มีอยู่ออกมี? ฉันกังวลว่าสิ่งนี้อาจไม่ครอบคลุมทุกอย่างที่ CHECKDB ทำ หนังสือ Books Online สำหรับ CHECKDBกล่าวว่านอกเหนือจาก CHECKALLOC, CHECKCATALOG และ CHECKTABLE แล้วยัง: ตรวจสอบเนื้อหาของทุกมุมมองที่จัดทำดัชนีในฐานข้อมูล ตรวจสอบความสอดคล้องระดับลิงก์ระหว่างตารางเมตาดาต้าและไดเรกทอรีระบบไฟล์และไฟล์เมื่อเก็บข้อมูล varbinary (สูงสุด) ในระบบไฟล์โดยใช้ FILESTREAM (SQL 2008 เท่านั้น) ตรวจสอบข้อมูล Service …

3
การระบุว่าค่าใดไม่ตรงกับแถวของตาราง
ฉันต้องการให้สามารถตรวจสอบได้อย่างง่ายดายว่าตัวระบุที่ไม่ซ้ำกันอยู่ในตารางของผู้ที่ระบุในแบบสอบถาม เพื่ออธิบายให้ดียิ่งขึ้นนี่คือสิ่งที่ฉันต้องทำตอนนี้เพื่อตรวจสอบ ID ของรายการ "1, 2, 3, 4" ที่ไม่มีอยู่ในตาราง: SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')สมมติว่าตารางไม่มีแถวที่มี ID 2 ดัมพ์ผลลัพธ์ลงใน Excel เรียกใช้ VLOOKUP ในรายการต้นฉบับที่ค้นหาแต่ละค่าของรายการในรายการผลลัพธ์ VLOOKUP ใด ๆ ที่ส่งผลให้#N/Aมีค่าที่ไม่ได้เกิดขึ้นในตาราง ฉันคิดว่าต้องมีวิธีที่ดีกว่าในการทำสิ่งนี้ ฉันกำลังมองหาสิ่งที่ต้องการ รายการที่จะตรวจสอบ -> แบบสอบถามบนตารางเพื่อตรวจสอบ -> สมาชิกของรายการที่ไม่ได้อยู่ในตาราง

2
ฉันจะเพิ่มนาทีในประเภทข้อมูลเวลาได้อย่างไร
ฉันมีขั้นตอนการจัดเก็บที่แทรกสองระเบียนลงในตารางความแตกต่างระหว่างบันทึกคือคอลัมน์เวลาของระเบียนที่สองอยู่@MinToAddหลังแรก: CREATE PROCEDURE CreateEntry /*Other columns*/ @StartTime time(2), @EndTime time(2), @MinutesToAdd smallint AS BEGIN SET NOCOUNT ON; SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed? IF (@MinutesToAdd > 0) BEGIN INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime) OUTPUT inserted.id VALUES (/*Other columns*/ @StartTime, @EndTime), (/*Other columns*/ @StartTime + …

3
ฐานข้อมูลเซิร์ฟเวอร์ sql sharding - จะทำอย่างไรกับข้อมูลทั่วไป / ข้อมูลที่ไม่ใช้เศษ
เรามีฐานข้อมูลระดับองค์กรขนาดใหญ่มาก เป็นส่วนหนึ่งของรูปแบบธุรกิจของเราผู้ใช้เว็บทุกคนเข้าเยี่ยมชมเว็บเซิร์ฟเวอร์ของเราในเวลาเดียวกันในแต่ละเดือน ปริมาณการใช้งานหนักมากและยังคงเติบโตยิ่งหนักยิ่ง บริษัท ใหญ่ขึ้น การเพิ่มประสิทธิภาพ sql proc ได้รับการดำเนินการและฮาร์ดแวร์ได้รับการปรับขนาดให้อยู่ในระดับที่สูงมากแล้ว เราต้องการทำลายฐานข้อมูลในขณะนี้เพื่อให้แน่ใจว่าเราสามารถรองรับการเติบโตของ บริษัท และการโหลดในอนาคต เราได้ตัดสินใจแล้วว่าข้อมูลใดควรถูกทิ้ง มันเป็นส่วนหนึ่งของฐานข้อมูลของเราซึ่งใช้อย่างมาก อย่างไรก็ตามคำถามของฉันเกี่ยวกับข้อมูลที่ไม่ใช้ร่วมกันซึ่งเป็นเรื่องธรรมดา / สากล ตัวอย่างของข้อมูลเช่นนี้อาจเป็นตารางคลังตัวอย่างหรืออาจเป็นตารางพนักงานตารางผู้ใช้เป็นต้น ฉันเห็นสองตัวเลือกในการจัดการข้อมูลทั่วไป / สากลนี้: 1) การออกแบบ 1 - วางข้อมูลทั่วไป / สากลในฐานข้อมูลภายนอก การเขียนทั้งหมดจะเกิดขึ้นที่นี่ ข้อมูลนี้จะถูกทำซ้ำลงไปในแต่ละชิ้นส่วนทำให้แต่ละชิ้นส่วนสามารถอ่านข้อมูลนี้และเข้าร่วมภายในกับข้อมูลนี้ในโปรแกรม t-sql 2) การออกแบบ 2 - ให้แต่ละสำเนาของตัวเองของข้อมูลทั่วไป / สากลทั้งหมด ปล่อยให้แต่ละชิ้นส่วนจะเขียนลงในตารางเหล่านี้และใช้การจำลองแบบ sql merge เพื่ออัปเดต / ซิงค์ข้อมูลนี้กับส่วนอื่นทั้งหมด ความกังวลเกี่ยวกับการออกแบบ # 1 1) ปัญหาการทำธุรกรรม: หากคุณมีสถานการณ์ที่คุณต้องเขียนหรืออัปเดตข้อมูลเป็นเศษแล้วเขียน …
10 sql-server 

2
ฉันควรสร้างดัชนีใหม่หลังจากตัดทอน / แทรกขนาดใหญ่หรือไม่
ฉันมีขั้นตอนการจัดเก็บที่ตัดทอนบางตารางที่มีแถวประมาณ 1.75M ในแต่ละแถวก่อนที่จะแทรกข้อมูลใหม่ (ขึ้นอยู่กับข้อมูลในตารางอื่น ๆ การคำนวณ ฯลฯ ) โครงร่างพื้นฐานง่ายมาก: ตัดทอนตาราง แทรก 1.75M แถวใน 'batches' ประมาณ 75,000 ต่อเวลา ฉันสงสัยว่าฉันควรสร้างดัชนีใหม่อีกครั้งอย่างชัดเจนตลอดเวลาในกระบวนการนี้หรือไม่? เช่น ตัดทอนตาราง ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [หรืออะไรที่คล้ายกัน] แทรกแถว 1.75M หรือบางที ALTER INDEX ALL ON xxx DISABLE ตัดทอนตาราง แทรกแถว 1.75M ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [หรืออะไรที่คล้ายกัน] …

2
SELECT / INSERT Deadlock
อินสแตนซ์นี้โฮสต์ฐานข้อมูล SharePoint 2007 (SP) เราประสบปัญหาการหยุดชะงัก SELECT / INSERT จำนวนมากต่อตารางที่ใช้งานหนักจำนวนหนึ่งในฐานข้อมูลเนื้อหา SP ฉัน จำกัด ทรัพยากรที่เกี่ยวข้องให้แคบลงกระบวนการทั้งสองต้องการล็อคในดัชนีที่ไม่ใช่คลัสเตอร์ INSERT ต้องการล็อค IX บนทรัพยากร SELECT และ SELECT ต้องการล็อค S บนทรัพยากร INSERT กราฟเดดล็อกแสดงให้เห็นและสามทรัพยากร 1. ) สองรายการจาก SELECT (เธรดขนานผู้ผลิต / ผู้บริโภค) และ 2) INSERT ฉันได้แนบกราฟการหยุดชะงักเพื่อตรวจสอบของคุณ เนื่องจากนี่คือรหัส Microsoft และโครงสร้างตารางเราไม่สามารถทำการเปลี่ยนแปลงใด ๆ อย่างไรก็ตามฉันได้อ่านบนเว็บไซต์ MSFT SP ว่าพวกเขาแนะนำให้ตั้งค่าตัวเลือกการกำหนดค่าระดับอินสแตนซ์ MAXDOP เป็น 1 เนื่องจากอินสแตนซ์นี้มีการใช้งานร่วมกันระหว่างฐานข้อมูล / แอปพลิเคชันอื่น …

3
ผู้ใช้ไม่สามารถดูตารางใน schema ที่ไม่ใช่ค่าเริ่มต้นใน SSMS
ฉันมีปัญหาในการตั้งค่าการVIEW DEFINITIONอนุญาตอย่างเหมาะสมในระดับสคีมาสำหรับผู้ใช้รายหนึ่งของฉัน ฉันสร้างคีมาTestSchemaแล้วเพิ่มบางตาราง ผู้ใช้ปัจจุบันมีสิทธิ์ในการเข้าถึงการตั้งค่าและปรับเปลี่ยนตาราง ( SELECT, UPDATE, DELETEฯลฯ ) ผ่านdbo_datareaderและdbo_datawriterบทบาท อย่างไรก็ตามพวกเขาไม่สามารถมองเห็นตารางใด ๆ ในตัวสำรวจวัตถุ SSMS ฉันลองให้สิทธิ์เพื่อดูคำจำกัดความ: grant view definition on SCHEMA :: [TestSchema] to [User] นั่นไม่ได้ผล ฉันพยายามตั้งค่าการอนุญาตระดับตาราง: grant view definition on [TestSchema].[NewTable] to [User] นั่นก็ไม่ได้ผล จากนั้นฉันก็ลองแค่ให้ผ้าห่ม: grant view definition to [User] และนั่นก็ใช้ได้ ตอนนี้พวกเขาสามารถมองเห็นTestSchemaได้เช่นเดียวกับสกีมาอื่น ๆ ที่พวกเขาไม่ควรเข้าถึง เป้าหมายของฉันที่นี่คืออนุญาตให้ผู้ใช้ดูตารางทั้งหมดภายในสคีมาที่กำหนด ฉันจะทำให้สำเร็จได้อย่างไร หากฉันควรจะทำสิ่งนี้โดยค่าเริ่มต้นฉันควรตรวจสอบสิทธิ์ใดบ้างเพื่อค้นหาสาเหตุที่ทำไม่ได้

2
ฉันต้องมีคอลัมน์รหัสแยกต่างหากสำหรับตาราง "การแมป" นี้หรือไม่
ฉันมีตารางProducersและตารางProductsซึ่งทั้งสองอย่างนี้มีรูปแบบ: Id - int คีย์หลัก Name - nvarchar ผู้ผลิตสามารถบรรทุกผลิตภัณฑ์ได้หลายตัวดังนั้นฉันจะสร้างตารางที่เรียกProducerDetailsว่าจะมี: ProducerId - int, foreign key to Producers.Id ProductId - int, foreign key to Products.Id จากนั้นฉันก็เริ่มตั้งคำถามกับตัวเองดังนั้นฉันจึงคิดว่าฉันจะถามผู้เชี่ยวชาญ การออกแบบฐานข้อมูลจะดีกว่าหรือไม่หากมีIdคอลัมน์เพิ่มเติม(int, คีย์หลัก) ในProducerDetailsตารางของฉัน หรือว่าไม่จำเป็น? ฉันใช้ SQL-Server 2008 R2 ถ้านั่นสร้างความแตกต่างได้เลย แก้ไข - ความสัมพันธ์ระหว่างตารางเหล่านี้จะเป็นแบบกลุ่มต่อกลุ่มฉันเชื่อว่าขอโทษที่ฉันไม่ได้บอกอย่างชัดเจน ผู้ผลิตสามารถดำเนินการผลิตภัณฑ์หลายประเภทและผลิตภัณฑ์เดียวกันสามารถผลิตได้โดยผู้ผลิตหลายราย ฉันขอโทษถ้าคำถามนี้ง่ายเกินไปการออกแบบความสมบูรณ์ของการอ้างอิง / ฐานข้อมูลไม่ใช่จุดแข็งของฉัน (แม้ว่าฉันจะพยายามปรับปรุงมัน)

1
กู้คืนฐานข้อมูลที่เข้ารหัสไปยังเซิร์ฟเวอร์อื่น
ฉันใช้ผลิตภัณฑ์ที่ทำงานบน SQLServer 2008 เข้าใจได้ว่า บริษัท ที่จัดหานั้นไม่ได้ให้การสนับสนุน SQLServer เมื่อฉันติดตั้งผลิตภัณฑ์ฉันระบุรหัสผ่านเพื่อเข้ารหัสฐานข้อมูล ฉันต้องการเรียกใช้สำเนาผลิตภัณฑ์อื่นเพื่อทดสอบบนเซิร์ฟเวอร์อื่น ฉันกู้คืนฐานข้อมูลไปยังเซิร์ฟเวอร์อื่นและติดตั้งผลิตภัณฑ์บนเซิร์ฟเวอร์อื่นนั้น เมื่อฉันติดตั้งฉันได้ให้รหัสผ่านเดียวกันแล้วคืนค่าการสำรองข้อมูลจากเซิร์ฟเวอร์หลัก อย่างไรก็ตามฉันได้รับข้อความแสดงข้อผิดพลาด: System.Data.SqlClient.SqlException: An error occurred during decryption. จากผลิตภัณฑ์ ฉันสามารถเข้าถึงตารางโดยใช้สตูดิโอจัดการ SQLServer ฉันได้ลองสิ่งนี้แล้ว: บนเซิร์ฟเวอร์แรก: CREATE CERTIFICATE cert1 WITH SUBJECT = 'Certificate for my stuff' BACKUP CERTIFICATE cert1 TO FILE = 'd:\backup\cert1.dat' WITH PRIVATE KEY ( ENCRYPTION BY PASSWORD = 'mypassword', FILE …

1
กราฟ SQL Server Deadlock - ล็อคตารางหน้าหรือแถว?
มีวิธีการถอดรหัสถ้าล็อคในกราฟการหยุดชะงักเป็นระดับตารางหน้าหรือแถว? ฉันมีข้อมูลทั้งหมดที่ฉันต้องการจากกราฟรวมถึงระดับการแยก (2) แต่ฉันก็อยากรู้สิ่งนี้เช่นกัน ขอบคุณทุกคนที่สามารถช่วยได้!

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 ไม่ทำงานและฉันไม่รู้วิธีจัดการส่วนที่สอง (เมื่ออินพุตไม่ถูกต้อง)

2
เปลี่ยนดัชนีอ้างอิงสำหรับ Foreign Key
ฉันมีสิ่งนี้: CREATE TABLE T1 ( Id INT ... ,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id] ) CREATE TABLE T2 ( .... ,T1_Id INT NOT NULL ,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id) ) เพื่อเหตุผลด้านประสิทธิภาพ (และการหยุดชะงัก) เหตุผลที่ฉันสร้างดัชนีใหม่บน T1 CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id) แต่ถ้าฉันตรวจสอบว่าดัชนีอ้างอิง FK ใดให้อ้างอิงไปยังดัชนีคลัสเตอร์ select ix.index_id, ix.name …

1
เหตุใดลำดับของ MS SQL Server จึงไม่มีพารามิเตอร์ ORDER เช่น Oracle
ในเอกสารประกอบของCREATE SEQUENCET-SQLคุณจะเห็นว่าCREATE SEQUENCEคำสั่งไม่มีORDERพารามิเตอร์ สำหรับการเปรียบเทียบเอกสาร Oracle สำหรับการCREATE SEQUENCEแสดงตัวเลือกORDER/ NOORDER: ORDER ระบุORDERเพื่อรับประกันว่าหมายเลขลำดับจะถูกสร้างขึ้นตามลำดับการร้องขอ ข้อนี้มีประโยชน์ถ้าคุณใช้หมายเลขลำดับเป็นเวลาประทับ คำสั่งที่รับประกันนั้นมักจะไม่สำคัญสำหรับลำดับที่ใช้สร้างคีย์หลัก ORDERจำเป็นสำหรับการรับประกันการสั่งซื้อเท่านั้นหากคุณใช้ Oracle Database กับ Real Application Clusters หากคุณใช้โหมดเอกสิทธิ์เฉพาะบุคคลหมายเลขลำดับจะถูกสร้างขึ้นตามลำดับเสมอ NOORDER ระบุNOORDERหากคุณไม่ต้องการรับประกันหมายเลขลำดับจะถูกสร้างขึ้นตามลำดับการร้องขอ นี่คือค่าเริ่มต้น Microsoft SQL Server มีข้อ จำกัด ในการสั่งซื้ออย่างมากSEQUENCEหรือไม่ หรือ Microsoft ไม่เห็นว่าสำคัญโดยทั่วไปใช่หรือไม่

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