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

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

3
สร้าง UNIQUEIDENTIFIER อย่างปลอดภัยใน SQL Server
ฉันตั้งใจจะใช้UNIQUEIDENTIFIERเป็นคีย์การเข้าถึงที่ผู้ใช้สามารถใช้เพื่อเข้าถึงข้อมูลบางอย่าง กุญแจจะทำหน้าที่เป็นรหัสผ่านในแง่นั้น ฉันจำเป็นต้องสร้างตัวระบุหลายตัวเป็นส่วนหนึ่งของINSERT...SELECTคำสั่ง ด้วยเหตุผลทางสถาปัตยกรรมฉันต้องการสร้างตัวระบุฝั่งเซิร์ฟเวอร์ในกรณีนี้ ฉันจะสร้างแบบสุ่มที่ปลอดภัยได้UNIQUEIDENTIFIERอย่างไร โปรดทราบว่าNEWIDจะไม่สามารถสุ่มได้มากพอเนื่องจากไม่ได้รับประกันคุณสมบัติความปลอดภัยใด ๆ เลย ฉันกำลังมองหา SQL Server ที่เทียบเท่ากับSystem.Security.Cryptography.RandomNumberGeneratorเพราะฉันต้องการ ID ที่ไม่สามารถคาดเดาได้ สิ่งใดขึ้นอยู่กับCHECKSUM, RANDหรือGETUTCDATEยังจะได้มีสิทธิ์

1
อนุญาตให้แทรกจำนวนมากในฐานข้อมูลเดียว
ฉันทำงานกับ บริษัท ที่มีความปลอดภัยด้านไอทีอย่างตรงไปตรงมา ฉันถูกจ้างเป็นนักวิเคราะห์ฐานข้อมูลเพื่อเพิ่มประสิทธิภาพกระบวนการบางอย่างในทีมของเรา ปัญหาคือฉันมีสิทธิ์อ่านและเขียนเท่านั้นและฉันพยายามหาสิทธิ์ขั้นสูงในฐานข้อมูล ขณะนี้เรามีฐานข้อมูลจำนวนมากในเซิร์ฟเวอร์เดียวและเราสามารถทำงานบนฐานข้อมูลเดียวฉันสงสัยว่าการBULK INSERTอนุญาตสามารถมอบให้กับฐานข้อมูลเดียวหรือว่าจะอนุญาตให้เซิร์ฟเวอร์ทั้งหมดหรือไม่ ฉันค้นหาผ่านเว็บเกี่ยวกับเรื่องนี้ แต่ฉันสับสนเล็กน้อย นี่คือสิ่งที่ฉันค้นพบ ในการใช้งาน BULK INSERT ฉันควรได้INSERTรับอนุญาตในตารางหรือฐานข้อมูลที่ต้องการADMINISTER BULK OPERATIONSซึ่งเป็นสิทธิ์ที่ครอบคลุมของเซิร์ฟเวอร์ หากฉันได้รับADMINISTER BULK OPERATIONSอนุญาตในฐานข้อมูลทั้งหมดและการINSERTอนุญาตในฐานข้อมูลเดียวฉันจะไม่สามารถทำได้เฉพาะBULK INSERTในฐานข้อมูลเดียวนั้นเนื่องจากฉันไม่มีINSERTสิทธิ์ในฐานข้อมูลอื่น เป็นไปได้หรือไม่ที่จะ จำกัด การใช้งานBULK INSERTฐานข้อมูลเดียวบนเซิร์ฟเวอร์ที่มีฐานข้อมูลหลายฐาน? ขออภัยเกี่ยวกับกำแพงข้อความและขอขอบคุณ!

2
ทศนิยมของเซิร์ฟเวอร์ SQL (9, 0) กับ INT
หนึ่งในลูกค้าของเราใช้คอลัมน์ประเภทข้อมูลDECIMAL(18,0)ในฐานข้อมูล SQL Server 2008R2 ของเขา เนื่องจากคอลัมน์เติบโตค่อนข้างช้าเขาจึงเสนอให้เปลี่ยนประเภทข้อมูลเป็นDECIMAL(5,0)พื้นที่เก็บข้อมูลบางส่วน ตามไลบรารี MSDNพื้นที่เก็บข้อมูลของDECIMAL(5,0)ประเภทข้อมูลนั้นก็เหมือนกับDECIMAL(9,0)ประเภทข้อมูล 5 ไบต์ INTมีขนาดเล็กกว่า 1 ไบต์ แต่สามารถจัดเก็บทุกอย่างในช่วง -2 ^ 31 ถึง 2 ^ 31 แทน -99,999 ถึง 99,999 ซึ่งDECIMAL(5,0)สามารถจัดเก็บได้ แม้แต่ใหญ่ที่สุดDECIMALซึ่งพอดีกับ 5 ไบต์ ( DECIMAL(9,0)) สามารถเก็บเฉพาะจำนวนเต็มในช่วง -999,999,999 ถึง 999,999,999 (ซึ่งน้อยกว่าครึ่งหนึ่งของช่วงที่INTเสนอใน 4 ไบต์) ฉันนึกถึง "ผลประโยชน์" สองอย่างของการใช้DECIMALเกินINT: ความสามารถในการเพิ่มสเกลในภายหลังโดยไม่ต้องใช้พื้นที่เก็บข้อมูลเพิ่มเติม ความสามารถในการขยายความแม่นยำสูงถึง 38 หลักโดยไม่ต้องเปลี่ยนประเภทข้อมูล แต่นี่ไม่ใช่ประโยชน์ที่แท้จริงในความคิดของฉัน: การเพิ่มสเกลให้กับจำนวนเต็มนั้นเหมาะสมในบางกรณีเท่านั้น (ในกรณีส่วนใหญ่ที่สเกลนั้นสร้างความแตกต่างก็สามารถเพิ่มได้ล่วงหน้า) SQL Server …

1
การตีความ Showplan XML ของ SQL Server
ฉันเพิ่งเปิดตัวฟีเจอร์บนเว็บไซต์ของฉันที่http://sqlfiddle.comซึ่งอนุญาตให้ผู้ใช้ดูแผนปฏิบัติการแบบดิบสำหรับการสืบค้น ในกรณีของ PostgreSQL, MySQL และ (ในระดับหนึ่ง) Oracle การดูผลลัพธ์ของแผนการดำเนินการดิบนั้นสามารถเข้าใจได้ อย่างไรก็ตามหากคุณดูผลลัพธ์ของแผนการดำเนินการสำหรับ SQL Server (สร้างด้วยSET SHOWPLAN_XML ON) จะมี XML จำนวนมหาศาลที่สามารถลุยได้แม้จะเป็นการสืบค้นที่ค่อนข้างง่าย นี่คือตัวอย่าง (นำมาจากแผนการดำเนินการของแบบสอบถามล่าสุดสำหรับ 'ซอ': http://sqlfiddle.com/#!3/1fa93/1 ): <ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.2500.0"> <BatchSequence> <Batch> <Statements> <StmtSimple StatementText="
select * from supportContacts" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="0.0032853" StatementEstRows="3" StatementOptmLevel="TRIVIAL" QueryHash="0x498D13A3874D9B6E" QueryPlanHash="0xD5DDBD3C2D195E96"> <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/> …

6
แผนปฏิบัติการช้าสำหรับ Proc ที่เก็บไว้
ฉันกำลังพยายามที่จะเข้าใจปัญหาที่เรามีกับ SQL Server 2000 เราเป็นเว็บไซต์ที่ทำธุรกรรมปานกลางและเรามี proc ที่เก็บไว้sp_GetCurrentTransactionsซึ่งเรียกว่ารับรหัสลูกค้าและสองวัน ตอนนี้ขึ้นอยู่กับวันที่และลูกค้าแบบสอบถามนี้สามารถส่งคืนอะไรก็ได้จากศูนย์ถึง 1,000 แถว ปัญหา: สิ่งที่เราพบคือทันใดนั้นเราจะได้รับข้อผิดพลาดจำนวนมาก (โดยทั่วไปExecution Timeout Expiredหรือคล้ายกัน) สำหรับลูกค้าเฉพาะขณะที่พวกเขาลองดำเนินการ proc ที่เก็บไว้ ดังนั้นเราตรวจสอบแบบสอบถามเรียกใช้ใน SSMS และพบว่าใช้เวลา 30 วินาที ดังนั้นเราจึงคอมไพล์ proc ที่เก็บไว้และ -bang- อีกครั้งมันทำงานใน 300ms ฉันได้พูดคุยกับ DBA ของเราเกี่ยวกับเรื่องนี้แล้ว เขาบอกฉันว่าฐานข้อมูลสร้างแผนแบบสอบถามเมื่อเราสร้าง proc ที่เก็บไว้ เขาบอกว่ามันเป็นแผนการที่ดีสำหรับชุดของพารามิเตอร์นั้น แต่ถ้าคุณโยนชุดของพารามิเตอร์ที่กำหนดไว้แผนจะไม่เป็นแผนการที่ดีที่สุดสำหรับข้อมูลนั้นและคุณจะเห็นว่ามันทำงานช้า ตัวเลือกที่นำเสนอให้ฉันคือการย้ายที่แบบสอบถามปัญหาจาก proc ที่เก็บไว้และกลับสู่ SQL แบบไดนามิกที่มีแผนการดำเนินการที่สร้างขึ้นในการทำงานทุกครั้ง มันให้ความรู้สึกเหมือนย้อนกลับไปหาฉันและฉันรู้สึกว่าต้องมีวิธีแก้ไข มีวิธีอื่นในการจัดการกับปัญหานี้หรือไม่? คำตอบใด ๆ และทั้งหมดได้รับการชื่นชม

1
ขยายระยะเวลาเหตุการณ์มิลลิวินาทีหรือไมโครวินาที?
มีคำถามในฟอรัมนี้เกี่ยวกับmodule_endหน่วยระยะเวลาขยายกิจกรรมซึ่งฉันตอบ รายละเอียดที่นี่ มันเป็นไมโครวินาทีสำหรับเหตุการณ์ทั้งหมดหรือไม่

5
กลุ่มไฟล์หลักคือ SQL Server 2008 แบบเต็ม
ฉันมีตารางขนาดใหญ่ (~ 50 ล้านแถว) ฉันพยายามแทรกจำนวนมากลงใน SQL Server และฉันได้รับข้อผิดพลาด: ไม่สามารถจัดสรรพื้นที่สำหรับวัตถุ 'myDB' ในฐานข้อมูล 'I 3 Stroke' ได้เนื่องจากกลุ่มไฟล์ 'หลัก' เต็ม สร้างพื้นที่ดิสก์โดยการลบไฟล์ที่ไม่ต้องการวางวัตถุในกลุ่มไฟล์เพิ่มไฟล์เพิ่มเติมไปยังกลุ่มไฟล์หรือการตั้งค่าอัตโนมัติสำหรับไฟล์ที่มีอยู่ในกลุ่มไฟล์ มีตารางอื่นในฐานข้อมูลที่มีประมาณ 25 ล้านแถว ฐานข้อมูลนี้จะใช้ในเครื่องเดียวเท่านั้นและจะได้รับการออกแบบมาเพื่อขุดข้อมูลที่มีอยู่แล้วและจะไม่มีการเติบโตเกินขนาดปัจจุบัน สำหรับสถานการณ์เช่นนี้เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหานี้ดังนั้น SQL Server จะไม่บ่นอะไร การแก้ปัญหาสำคัญหรือไม่ที่ฐานข้อมูลนี้จะไม่ถูกเปิดเผยต่อผู้ใช้หลายคน?

3
วิธีนับจำนวนคอลัมน์ที่แตกต่างกันในตารางเดียวกัน
ตาราง # 01 Status: StatusID Status ----------------------- 1 Opened 2 Closed 3 ReOpened 4 Pending ตารางที่ 02 Claims: ClaimID CompanyName StatusID -------------------------------------- 1 ABC 1 2 ABC 1 3 ABC 2 4 ABC 4 5 XYZ 1 6 XYZ 1 ผลลัพธ์ที่คาดหวัง: CompanyName TotalOpenClaims TotalClosedClaims TotalReOpenedClaims TotalPendingClaims -------------------------------------------------------------------------------- ABC 2 1 …
15 sql-server  pivot 

5
มันสมเหตุสมผลไหมที่จะใช้เครื่องหมายวงเล็บของ SQL Server ในโค้ดที่เขียนด้วยมือ?
ตัวสร้างโค้ดมักจะง่ายกว่าเมื่อสร้างผลลัพธ์โดยใช้เครื่องหมายวงเล็บของ Microsoft ใหม่ ( []) สำหรับเกือบทุกอย่าง เมื่อฉันเห็นมันครั้งแรกฉันก็ยังว้าววววววววววววจุติของสัญกรณ์ตัวระบุที่ยกมาค่อนข้างห้าม เท่าที่ฉันรู้ว่ามันเป็นส่วนเสริมที่เป็นกรรมสิทธิ์จาก Microsoft (หมายถึง Oracle ไม่สนับสนุน) ดูที่ SQL Server ไม่มีความแตกต่างถ้าคุณกำหนดตารางเช่น CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]); หรือ CREATE TABLE dbo.Table_2 (col1 int, col2 int); มันเป็นเรื่องของสไตล์ส่วนตัวหรือองค์กร คงเส้นคงวา. ตอนนี้ถ้าคุณต้องการโยกย้ายฐานข้อมูลของคุณไปยัง Oracle วงเล็บจะไม่มีตัวเลือก คุณสามารถใช้ตัวระบุที่เสนอราคาแบบเก่า แต่ตัวพิมพ์เล็กและตัวพิมพ์เล็กนั้นทำให้เกิดปัญหามากมาย เป็นความคิดที่ดีหรือไม่ที่จะลบวงเล็บทั้งหมดออกจากรหัสที่สร้างหลีกเลี่ยงการใช้ช่องว่างตัวอักษรพิเศษอื่น ๆ และคำหลักที่สงวนไว้สำหรับชื่อและรหัสในวิธีที่ DBMS ส่วนใหญ่เข้าใจ

1
ถอดรหัส Base64 String ใน SQL Server
ฉันมีvarcharคอลัมน์ในตารางใน SQL Server ซึ่งเก็บสตริงข้อความที่เข้ารหัส base64 ซึ่งฉันต้องการถอดรหัสเป็นข้อความธรรมดาที่เทียบเท่า SQL Server มีฟังก์ชันดั้งเดิมใด ๆเพื่อจัดการกับสิ่งนี้หรือไม่? สตริง base64 ตัวอย่าง: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== ซึ่งถอดรหัสเป็น: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

4
วิธีการเลือกแถวแรกจากการเข้าร่วมที่ส่งกลับหลายแถวในคีย์หลัก
สิ่งนี้เกี่ยวข้องกับคำถามนี้: การรวมผลลัพธ์หลาย ๆ ตารางเข้าด้วยกันเป็นแถว ฉันมีสองตารางที่ฉันเข้าร่วม พวกเขาแบ่งปันกุญแจ ตารางบุคคลมีชื่อหนึ่งชื่อต่อคีย์หลัก แต่ตารางอีเมลนั้นมีหลายอีเมลต่อ personId ฉันต้องการแสดงอีเมลแรกต่อคนเท่านั้น ปัจจุบันฉันได้รับหลายแถวต่อคนเพราะพวกเขามีอีเมลหลายฉบับ ฉันใช้ SQL-Server 2005 แก้ไข: นี่คือ T-SQL อีเมลแรกคือแถวอีเมลแรกต่อคน แก้ไข 2: อีเมลแรกที่ฉันเห็นมันจะเป็นแถวอีเมลแรกที่แสดงในการเข้าร่วมเมื่อ SQL ทำงานผ่านการสืบค้น ฉันไม่สำคัญว่าจะแสดงอีเมลใด มีเพียงอีเมลเดียวเท่านั้นที่ปรากฏขึ้น ฉันหวังว่ามันจะชัดเจนยิ่งขึ้น Table1: Person Table2: Email Select Person.PersonName, Email.Email From person left join on Person.ID=Email.PersonId;

6
การเปลี่ยนรหัสผ่าน sa
ฉันกำลังพยายามเปลี่ยนรหัสผ่านของบัญชี sa โดยใช้ SQL Server Management Studio 2012 ฉันได้ทำตามขั้นตอนด้านล่าง แต่รหัสผ่านยังคงเหมือนเดิม ล็อกอินเข้าสู่ SQL Server Management Studio, เลือกโปรแกรมฐานข้อมูล, \ SBSmonitoring, Windows Authentication ไปที่ Object Explorer - โฟลเดอร์ความปลอดภัย - โฟลเดอร์เข้าสู่ระบบ คลิกขวาที่บัญชี SA และเลือกตัวเลือกคุณสมบัติ ในหน้าทั่วไปเปลี่ยนรหัสผ่าน SA และยืนยัน ในหน้าสถานะเปลี่ยนเข้าสู่การเปิดใช้งาน คลิกตกลงเพื่อบันทึกการเปลี่ยนแปลง รีสตาร์ทเซิร์ฟเวอร์ SQL และบริการทั้งหมด ความคิดใด ๆ
15 sql-server 

1
มีวิธีที่สง่างามในการส่งผลการสืบค้นโดยตรงไปยังเครื่องพิมพ์จริงหรือไม่?
ฉันมีคำขอนี้แปลกที่จะมีรายงานที่กำหนดและพิมพ์ไปยังเครื่องพิมพ์ รายงานเองนั้นค่อนข้างง่ายและพอดีกับหน้าเดียว ฉันสามารถพิมพ์ลงใน txt ได้และมันก็ใช้ได้ (แม้ว่าฉันจะเปิดรับข้อเสนอแนะเกี่ยวกับผลิตภัณฑ์ที่ดีกว่า) นี่คือรหัส มันได้ผล. แต่ฉันไม่ชอบมัน โดยเฉพาะ id ต้องการลบด้วย @bcp และ @SQL ที่ซ้อนกัน คำถาม:มีวิธีที่สง่างามกว่านี้หรือไม่? declare @filepath varchar(255), @filename varchar(255), @filetype varchar(255), @sql nvarchar(max), @coverpage_text nvarchar(max) set @filepath = 'C:\users\jmay\documents\' SET @filename = 'TestFile' set @filetype = '.txt' --output to txt set @sql = N'declare @bcp varchar(4000) set …
14 sql-server 

4
RAID0 แทนที่จะเป็น RAID1 หรือ 5 นี่มันบ้าหรือเปล่า
ฉันกำลังพิจารณาใช้การตั้งค่า RAID0 สำหรับหนึ่งในกลุ่มเซิร์ฟเวอร์ SQL ของเรา ฉันจะร่างสถานการณ์และกำลังหาสาเหตุที่อาจเป็นความคิดที่ไม่ดี นอกจากนี้ถ้าคนที่คุณใช้เคสเอกสารสีขาวหรือเอกสารอื่น ๆ คุณสามารถชี้ให้ฉันเห็นในหัวข้อนี้ได้ เรามี 3 เซิร์ฟเวอร์ใน 2 ดาต้าเซ็นเตอร์ซึ่งเป็นส่วนหนึ่งของคลัสเตอร์ SQL พวกเขากำลังเรียกใช้ SQL Server ทั้งหมดในกลุ่มความพร้อมใช้งาน ตัวหลักมีแบบจำลองอยู่ข้าง ๆ และอีกตัวในดาต้าเซ็นเตอร์อื่น พวกเขากำลังเรียกใช้การจำลองแบบซิงโครนัสกับ failover อัตโนมัติ ไดรฟ์ทั้งหมดเป็น SSD ระดับองค์กร พวกเขาจะใช้ SQL Server 2017 หรือ 2019 ฉันคิดว่ามันจะมีประโยชน์หลายอย่างในการใช้งาน RAID0 ในอาร์เรย์มากกว่าวิธีอื่น ๆ หากมีข้อเสียจริง ข้อเสียเชิงลบที่ฉันเห็นอยู่ในขณะนี้คือการขาดความซ้ำซ้อนบนเซิร์ฟเวอร์หลักดังนั้นจึงไม่สามารถเพิ่มได้ ในฐานะที่เป็นข้อดี: หากไดรฟ์ล้มเหลวแทนที่จะทำงานในสถานะที่ช้าและเสื่อมโทรมจนกว่าจะมีคนได้รับการแจ้งเตือนว่ามีการกระทำด้วยตนเองเซิร์ฟเวอร์จะไม่สามารถทำการสำรองข้อมูลได้ทันที สิ่งนี้จะมีประโยชน์เพิ่มเติมในการแจ้งให้เราทราบถึงความล้มเหลวดังนั้นเราจึงสามารถตรวจสอบสาเหตุได้เร็วขึ้น มันลดโอกาสของความล้มเหลวโดยรวมต่อกำลังการผลิต TB เนื่องจากเราไม่ต้องการพาริตีหรือมิรเรอร์ไดร์ฟเราจึงลดจำนวนไดรฟ์ต่ออาเรย์ เมื่อมีไดรฟ์น้อยลงโอกาสในการเกิดความล้มเหลวก็จะน้อยลง มันถูกกว่า. ต้องการไดรฟ์น้อยลงสำหรับความจุที่ต้องการของเราลดค่าใช้จ่ายอย่างเห็นได้ชัด ฉันรู้ว่านี่ไม่ใช่ความคิดทางธุรกิจทั่วไป …

1
การประเมินภาวะเชิงหัวใจนอกฮิสโตแกรม
ติดตั้ง ฉันมีปัญหาในการทำความเข้าใจการประเมินความสำคัญเชิงหัวใจ นี่คือการตั้งค่าการทดสอบของฉัน: เวอร์ชัน 2010 ของฐานข้อมูล Stack Overflow SQL Server 2017 CU15 + GDR (KB4505225) - 14.0.3192.2 CE ใหม่ (ระดับความเข้ากันได้ 140) ฉันมี proc นี้: USE StackOverflow2010; GO CREATE OR ALTER PROCEDURE #sp_PostsByCommentCount @CommentCount int AS BEGIN SELECT * FROM dbo.Posts p WHERE p.CommentCount = @CommentCount OPTION (RECOMPILE); END; GO ไม่มีดัชนีหรือสถิติที่ไม่ใช่คลัสเตอร์ในdbo.Postsตาราง …

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