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

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

2
การตรวจสอบข้อ จำกัด การตรวจสอบคืออะไร
ฉันมี T-SQL ที่สร้างขึ้นอัตโนมัติซึ่งน่าจะถูกต้อง แต่ฉันไม่เข้าใจจริงๆ ALTER TABLE [dbo].[MyTable] WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; ฉันรู้ว่าข้อ จำกัด ของคีย์ต่างประเทศคืออะไร แต่คือCHECK CHECKอะไร

2
จำนวนนิพจน์ค่าแถวในคำสั่ง INSERT มีค่าเกินจำนวนสูงสุดที่อนุญาตของค่าแถว 1,000 ค่า
หนึ่งในINSERT INTOสคริปต์ถูกเขียนดังนี้ INSERT INTO tableName (Column1, Column2,....) VALUES (value1, Value2,...), (value1, Value2,...),.... ต่อไปนี้เป็นข้อผิดพลาดที่เรากำลังเผชิญกับการแยกวิเคราะห์คำสั่งแทรกด้านบน ข่าวสารเกี่ยวกับ 10738, ระดับ 15, สถานะ 1, บรรทัด 1007 จำนวนนิพจน์ค่าของแถวในคำสั่ง INSERT เกินจำนวนสูงสุดที่อนุญาตของค่าแถว 1,000 ค่า คำถามง่ายๆของฉันคือว่าเราสามารถเปลี่ยนวงเงินได้ 1,000 ค่าหรือไม่

5
ทำไมฉันไม่สามารถใช้คำสั่ง CASE เพื่อดูว่ามีคอลัมน์อยู่หรือไม่และไม่ได้เลือกคอลัมน์
ทำไมบางอย่างเช่นนี้จึงไม่ทำงาน SELECT CASE WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL ELSE Somecol END AS MyTest FROM Customers; ฉันแค่ตรวจสอบว่ามีคอลัมน์อยู่อย่างไรก็ตาม SQL Server บ่นว่าSomecolไม่มีอยู่ มีทางเลือกอื่นสำหรับสิ่งนี้ในข้อความเดี่ยว?
17 sql-server  t-sql 

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

2
วนซ้ำ CTE เพื่อหาผลรวมสำหรับเด็กทุกคน
นี่คือต้นไม้ประกอบที่ฉันต้องการค้นหาโดยใช้T-SQLแบบสอบถามซ้ำ(สมมุติCTE) ด้วยผลลัพธ์ที่คาดหวังด้านล่าง ฉันต้องการที่จะรู้จำนวนรวมต่อการชุมนุมที่ได้รับส่วนใดส่วนหนึ่ง หมายความว่าถ้าฉันค้นหา 'หมุดย้ำ' ฉันต้องการทราบจำนวนรวมในแต่ละระดับภายในการชุมนุมไม่ใช่เฉพาะจำนวนลูกโดยตรง Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 …

3
สร้างลำดับชั้นของหลายระดับโดยที่แต่ละโหนดมีจำนวนชายด์แบบสุ่ม
ฉันต้องการสร้างข้อมูลทดสอบที่เกี่ยวข้องกับลำดับชั้น ฉันสามารถทำให้ง่ายและทำสองสามCROSS JOINวินาที แต่นั่นจะให้โครงสร้างที่เหมือนกันโดยสมบูรณ์ / ไม่มีการเปลี่ยนแปลงใด ๆ นั่นไม่เพียง แต่ดูน่าเบื่อ แต่การขาดความผันแปรในข้อมูลการทดสอบบางครั้งก็เป็นตัวกำหนดปัญหาที่อาจพบได้ ดังนั้นฉันต้องการสร้างลำดับชั้นที่ไม่เหมือนกันซึ่งปฏิบัติตามกฎเหล่านี้: ลึก 3 ระดับ ระดับ 1 คือการสุ่ม 5 - 20 โหนด ระดับ 2 คือ 1 - 10 โหนดสุ่มต่อโหนดระดับ 1 แต่ละโหนด ระดับ 3 คือ 1 - 5 โหนดสุ่มต่อโหนดระดับ 2 แต่ละโหนด ทุกสาขาจะลึก 3 ระดับ ความสม่ำเสมอในเชิงลึกก็โอเค ณ จุดนี้ อาจมีการทับซ้อนกันในชื่อของโหนดลูกในระดับที่กำหนดใด ๆ (เช่นชื่อของโหนดลูกไม่จำเป็นต้องไม่ซ้ำกันในทุกโหนดในระดับเดียวกัน) คำว่า "สุ่ม" …

2
ผลลัพธ์ที่ไม่คาดคิดพร้อมตัวเลขสุ่มและประเภทการเข้าร่วม
ฉันมีสคริปต์ง่าย ๆ ที่ได้รับตัวเลขสุ่มสี่ตัว (1 ถึง 4) จากนั้นก็กลับมารวมกันเพื่อรับหมายเลข database_id ที่ตรงกัน เมื่อฉันรันสคริปต์ด้วย LEFT JOIN ฉันจะได้สี่แถวกลับมาทุกครั้ง (ผลลัพธ์ที่คาดหวัง) อย่างไรก็ตามเมื่อฉันเรียกใช้ด้วยการเข้าร่วมภายในฉันได้รับจำนวนแถวที่แตกต่างกัน - บางครั้งสองครั้งบางครั้งแปด เหตุผลไม่ควรมีความแตกต่างเพราะฉันรู้ว่าแถวที่มี database_ids 1-4 อยู่ในฐานข้อมูล และเนื่องจากเราเลือกจากตารางตัวเลขสุ่มที่มีสี่แถว (ซึ่งต่างจากการเข้าร่วมกับตาราง) จึงไม่ควรมีการส่งคืนเกินสี่แถว สิ่งนี้เกิดขึ้นทั้งใน SQL Server 2012 และ 2014 อะไรคือสาเหตุที่ทำให้ INNER JOIN ส่งกลับจำนวนแถวที่แตกต่างกัน /* Works as expected -- always four rows */ SELECT rando.RandomNumber, d.database_id FROM (SELECT 1 + …
16 sql-server  t-sql 

2
วิธีตรวจสอบตัวละครที่ไม่ใช่แอสตี้
วิธีที่ดีที่สุดในการตรวจสอบว่าเขตข้อมูล VARCHAR มีอักขระที่ไม่ใช่แบบ ASCII คืออะไร CHAR(1)ผ่านCHAR(31)และผ่านCHAR(127)CHAR(255) ฉันลองใช้PATINDEXและพบปัญหาต่อไปนี้ ตรวจสอบช่วงล่างทำงานอย่างถูกต้อง SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0 ข้อมูลของฉันมีสามระเบียนด้วย 0x1E และทั้งสามรายการที่ส่งคืน แต่เมื่อฉันตรวจสอบเฉพาะช่วงบน: SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 มันส่งกลับใกล้กับระเบียนทั้งหมดในตาราง (จำนวนตาราง 170737 และส่งกลับจำนวน 170735) และเนื่องจากข้อมูลของฉันไม่ได้มีค่าใด ๆ ในช่วงนี้ฉันจะคิดว่ามันไม่ควรกลับไม่มีระเบียน

3
ขั้นตอนการจัดเก็บฐานข้อมูลด้วย“ โหมดแสดงตัวอย่าง”
รูปแบบที่พบบ่อยพอสมควรในแอปพลิเคชันฐานข้อมูลที่ฉันทำงานด้วยคือต้องสร้างขั้นตอนการจัดเก็บสำหรับรายงานหรือยูทิลิตี้ที่มี "โหมดตัวอย่าง" เมื่อโพรซีเดอร์ดังกล่าวทำการอัพเดตพารามิเตอร์นี้บ่งชี้ว่าผลลัพธ์ของแอ็คชันควรถูกส่งคืน แต่โพรซีเดอร์ไม่ควรทำการอัพเดตกับฐานข้อมูล วิธีหนึ่งในการทำสิ่งนี้ให้สำเร็จคือการเขียนifคำสั่งสำหรับพารามิเตอร์และมีโค้ดบล็อกที่สมบูรณ์สองบล็อก หนึ่งในนั้นจะปรับปรุงและส่งคืนข้อมูลและอื่น ๆ เพียงแค่ส่งคืนข้อมูล แต่สิ่งนี้ไม่เป็นที่พึงปรารถนาเนื่องจากการทำสำเนารหัสและความเชื่อมั่นค่อนข้างต่ำว่าข้อมูลตัวอย่างเป็นภาพสะท้อนที่ถูกต้องแม่นยำว่าจะเกิดอะไรขึ้นกับการอัปเดต ตัวอย่างต่อไปนี้พยายามใช้ประโยชน์จากจุดบันทึกและตัวแปรของการทำธุรกรรม (ซึ่งไม่ได้รับผลกระทบจากธุรกรรมตรงกันข้ามกับตาราง temp ซึ่งเป็น) เพื่อใช้รหัสบล็อกเดียวสำหรับโหมดแสดงตัวอย่างเป็นโหมดการอัปเดตสด หมายเหตุ: การย้อนกลับของธุรกรรมไม่ใช่ตัวเลือกเนื่องจากการเรียกขั้นตอนนี้อาจซ้อนอยู่ในธุรกรรม นี่คือการทดสอบใน SQL Server 2012 CREATE TABLE dbo.user_table (a int); GO CREATE PROCEDURE [dbo].[PREVIEW_EXAMPLE] ( @preview char(1) = 'Y' ) AS CREATE TABLE #dataset_to_return (a int); BEGIN TRANSACTION; -- preview mode required infrastructure DECLARE @output_to_return …
15 sql-server  t-sql 

2
ทำไมการประมาณแถวของ SQL Server จึงเปลี่ยนเมื่อฉันเพิ่มคำแนะนำการเข้าร่วม
ฉันมีแบบสอบถามที่รวมตารางไม่กี่ตารางและทำงานได้ไม่ดีนัก - การประมาณแถวเป็นวิธีปิด (1,000 ครั้ง) และมีการเลือกการเข้าร่วมลูปซ้อนกันทำให้เกิดการสแกนหลายตาราง รูปร่างของแบบสอบถามค่อนข้างตรงไปตรงมามีลักษณะดังนี้: SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID เล่นรอบกับแบบสอบถามฉันสังเกตเห็นว่าเมื่อฉันบอกเป็นนัย ๆ ให้ใช้การรวม Merge สำหรับการรวมอย่างใดอย่างหนึ่งมันทำงานเร็วขึ้นหลายครั้ง สิ่งนี้ฉันสามารถเข้าใจได้ - การรวมการผสานเป็นตัวเลือกที่ดีกว่าสำหรับข้อมูลที่เข้าร่วม แต่ SQL Server ไม่คาดการณ์ว่าจะเลือก …

2
ทำไมฟังก์ชันอันทรงคุณค่าของสเกลาร์ต้องได้รับอนุญาตให้ดำเนินการแทนที่จะเลือก
ฉันสงสัยว่าเพราะเหตุใดสำหรับฟังก์ชันที่มีค่าสเกลาร์ฉันต้องให้ผู้ใช้ดำเนินการแทนที่จะเลือกเท่านั้น? ในขณะที่ฟังก์ชั่นที่มีคุณค่าของตารางนั้นใช้งานได้ดีโดยมีเพียงสิทธิ์อนุญาตหรือความdb_datareaderเป็นสมาชิกที่เลือกเท่านั้น เพื่อให้ชัดเจนยิ่งขึ้นนี่คือตัวอย่างของฉัน: ฉันต้องการผู้ใช้ที่ได้รับอนุญาตให้อ่านฐานข้อมูลเท่านั้น ดังนั้นฉันจึงสร้างผู้ใช้ที่เรียกว่าtestUserและให้การdb_datareaderเป็นสมาชิก fn_InlineTableแล้วฉันสร้างตารางมูลค่าฟังก์ชั่นที่เรียกว่า และทุกอย่างยอดเยี่ยม testUserรัน SQL นี้ตลอดทั้งวัน select * from dbo.fn_InlineTable fn_ScalarTestแล้วฉันต้องมีฟังก์ชั่นเกลาดังนั้นฉันสร้างฟังก์ชั่นที่เรียกว่าสเกลา testUserไม่สามารถรัน SQL นี้ Select dbo.fn_ScalarTest(1) ดีเข้าใจ: มันเป็นเพราะผมยังไม่ได้ให้ "testuser" fn_ScalarTestได้รับอนุญาตในการดำเนินการ คำถามของฉันคือ: ตามลิงค์นี้/programming/6150888/insert-update-delete-with-function-in-sql-serverซึ่งบอกว่าFUNCTIONไม่สามารถใช้เพื่อดำเนินการแก้ไขสถานะฐานข้อมูลได้ . ดังนั้นทำไมไม่ปล่อยให้ฟังก์ชั่นสเกลาร์ถูกใช้ด้วยสิทธิ์ "SELECT" แบบเดียวกันแทนที่จะเรียกใช้สิทธิ์ ??? ฉันหวังว่าคำถามของฉันจะสมเหตุสมผล ขอขอบคุณ.

1
ฉันจะออกแบบแบบสอบถามเพื่อหยุดชั่วคราว / พัก / รอเป็นระยะเวลาที่กำหนดได้อย่างไร
ฉันกำลังทดสอบแอปพลิเคชันตรวจสอบกับอินสแตนซ์ SQL Server 2000 ฉันจะเขียนเคียวรี T-SQL ที่ใช้เวลาในการระบุได้อย่างไร ตัวอย่างเช่นภาษาสคริปต์ส่วนใหญ่มีSLEEPคำสั่งที่ให้คุณหยุดการทำงานของสคริปต์ชั่วคราวตามเวลาที่กำหนด ฉันกำลังมองหาสิ่งที่คล้ายกันที่เข้ากันได้กับ SQL Server 2000 นี่คือจุดประสงค์เพื่อทดสอบการตั้งค่าขีด จำกัด การสืบค้นที่ใช้งานได้ยาวนานของแอปพลิเคชันการตรวจสอบ

3
รับจำนวนการตรวจสอบและจำนวนการพิมพ์จากข้อมูลการสูญเสียผลเสมอ
ฉันทำSQL Fiddleสำหรับคำถามนี้ถ้านั่นทำให้ทุกคนง่ายขึ้น ฉันมีฐานข้อมูลกีฬาแนวแฟนตาซีและสิ่งที่ฉันพยายามคิดคือทำอย่างไรกับข้อมูล "แนวปัจจุบัน" (เช่น 'W2' หากทีมชนะการแข่งขัน 2 นัดสุดท้ายหรือ 'L1' หากพวกเขาแพ้ นัดสุดท้ายของพวกเขาหลังจากชนะนัดก่อนหน้า - หรือ 'T1' ถ้าพวกเขาเสมอนัดล่าสุด นี่คือสคีมาพื้นฐานของฉัน: CREATE TABLE FantasyTeams ( team_id BIGINT NOT NULL ) CREATE TABLE FantasyMatches( match_id BIGINT NOT NULL, home_fantasy_team_id BIGINT NOT NULL, away_fantasy_team_id BIGINT NOT NULL, fantasy_season_id BIGINT NOT NULL, fantasy_league_id BIGINT NOT NULL, fantasy_week_id …

4
วิธีการเปลี่ยนแปลงหรืออัปเดตการเชื่อมต่อเซิร์ฟเวอร์ท้องถิ่นในงานแผนการบำรุงรักษา
สองวันหลังลูกค้าของเราเปลี่ยนชื่อเซิร์ฟเวอร์ Dev ของเรา หลังจากเปลี่ยนชื่อเซิร์ฟเวอร์แล้วงานบำรุงรักษาของฉันและงานอื่นทั้งหมดจะล้มเหลวเนื่องจากชื่อเซิร์ฟเวอร์ไม่ตรงกัน เรากำลังใช้เวอร์ชันsql server 2012และเซิร์ฟเวอร์ 2008 OS ดังนั้นเช้าวันนี้ฉันจึงเปลี่ยนชื่อเซิร์ฟเวอร์ SQL ของฉันเป็นชื่อที่ได้รับการอัพเดตและสร้างตาราง ฉันพยายามอัปเดตการเชื่อมต่อเซิร์ฟเวอร์ภายในในงานบำรุงรักษา แต่ไม่สามารถแก้ไขได้ จากนั้นฉันเพิ่มการเชื่อมต่อเซิร์ฟเวอร์ใหม่ยังคงไม่มีประโยชน์ฉันได้รับข้อผิดพลาดด้านล่างขณะดำเนินงาน หลังจากที่ฉันลองกับหน้าเป้าหมายในตัวเลือกคุณสมบัติงานมีเฉพาะเซิร์ฟเวอร์เป้าหมายเท่านั้นที่ถูกเลือกและเซิร์ฟเวอร์เป้าหมายหลายตัวถูกปิดใช้งาน ข้อผิดพลาดด้านล่าง ดำเนินการในฐานะผู้ใช้: NT Service \ SQLSERVERAGENT Microsoft (R) SQL Server Execute Package Utility เวอร์ชัน 11.0.2100.60 สำหรับ 64- บิตลิขสิทธิ์ (C) Microsoft Corporation สงวนลิขสิทธิ์. เริ่มต้น: 12:01:28 AM ข้อผิดพลาด: 2013-12-16 00: 01: 43.98 รหัส: 0xC00291EC ที่มา: {410F7661-F71A-4B68-9584-BA422AB00F02} …

2
วิธีเพิ่มประสิทธิภาพการสืบค้น T-SQL โดยใช้ Execution Plan
ฉันมีแบบสอบถาม SQL ที่ฉันใช้เวลาสองวันที่ผ่านมาพยายามเพิ่มประสิทธิภาพโดยใช้การทดลองและข้อผิดพลาดและแผนการดำเนินการ แต่ไม่มีประโยชน์ โปรดยกโทษให้ฉันที่ทำเช่นนี้ แต่ฉันจะโพสต์แผนการดำเนินการทั้งหมดที่นี่ ฉันได้ใช้ความพยายามในการสร้างชื่อตารางและคอลัมน์ในแบบสอบถามและแผนปฏิบัติการทั่วไปทั้งเพื่อความกระชับและเพื่อปกป้อง IP ของ บริษัท ของฉัน แผนปฏิบัติการสามารถเปิดได้กับSQL ยามแผน Explorer ที่ ฉันทำ T-SQL ในปริมาณที่พอใช้ แต่การใช้แผนการดำเนินการเพื่อเพิ่มประสิทธิภาพการสืบค้นของฉันเป็นพื้นที่ใหม่สำหรับฉันและฉันได้พยายามเข้าใจวิธีการทำ ดังนั้นหากใครสามารถช่วยฉันด้วยและอธิบายว่าแผนปฏิบัติการนี้สามารถถอดรหัสเพื่อค้นหาวิธีในการค้นหาเพื่อเพิ่มประสิทธิภาพได้ฉันจะขอบคุณตลอดไป ฉันมีคำถามเพิ่มเติมเพื่อเพิ่มประสิทธิภาพ - ฉันต้องการกระดานกระโดดน้ำเพื่อช่วยฉันในเรื่องนี้เป็นครั้งแรก นี่คือแบบสอบถาม: DECLARE @Param0 DATETIME = '2013-07-29'; DECLARE @Param1 INT = CONVERT(INT, CONVERT(VARCHAR, @Param0, 112)) DECLARE @Param2 VARCHAR(50) = 'ABC'; DECLARE @Param3 VARCHAR(100) = 'DEF'; DECLARE @Param4 VARCHAR(50) …

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