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

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

2
ทำไมสัญลักษณ์ตัวแทนในกลุ่มจำแนกตามคำสั่งไม่ทำงาน
ฉันพยายามทำให้คำสั่ง SQL ต่อไปนี้ทำงาน แต่ฉันได้รับข้อผิดพลาดทางไวยากรณ์: SELECT A.*, COUNT(B.foo) FROM TABLE1 A LEFT JOIN TABLE2 B ON A.PKey = B.FKey GROUP BY A.* ที่นี่ A เป็นตารางกว้างที่มี 40 คอลัมน์และฉันต้องการหลีกเลี่ยงการแสดงชื่อแต่ละคอลัมน์ในกลุ่มตามข้อถ้าเป็นไปได้ ฉันมีตารางดังกล่าวจำนวนมากซึ่งฉันต้องเรียกใช้แบบสอบถามที่คล้ายกันดังนั้นฉันจะต้องเขียนกระบวนงานที่เก็บไว้ วิธีที่ดีที่สุดในการเข้าถึงสิ่งนี้คืออะไร? ฉันใช้ MS SQL Server 2008

3
OPTION FAST ในคำสั่ง SELECT ทำอะไร?
ฉันได้ทำการขุดในสิ่งที่OPTION (FAST XXX)คำใบ้ในแบบสอบถามSELECTและฉันยังสับสนอยู่ อ้างอิงจาก MSDN: ระบุว่าเคียวรีถูกปรับให้เหมาะสมสำหรับการดึง number_rows แรกอย่างรวดเร็ว นี่เป็นจำนวนเต็มที่ไม่ใช่ค่าลบ หลังจากที่ number_rows แรกถูกส่งคืนเคียวรีจะยังคงประมวลผลและสร้างชุดผลลัพธ์แบบเต็ม สำหรับฉันที่ไม่สมเหตุสมผล แต่โดยทั่วไปแล้วการสืบค้นจะได้แถว XXX แรกเร็วมากจากนั้นส่วนที่เหลือที่ความเร็วปกติคืออะไร แบบสอบถาม Microsoft Dynamics ที่ทำให้ฉันคิดในเรื่องนี้คือ: select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid from pjproj WITH (NOLOCK) where project like '%' order by project OPTION(FAST 500) ทุกคนสามารถอธิบายได้อย่างชัดเจนว่าคำใบ้ของแบบสอบถามนี้กำลังทำอะไรและมีข้อได้เปรียบเหนือการไม่ใช้

2
ถ้าเป็นบวกให้รวมทุกรายการ หากลบให้คืนค่าแต่ละค่า
ฉันต้องการหาวิธีหาSUM()ค่าบวกทั้งหมดnumและคืนSUM()ค่าจำนวนบวกทั้งหมดและแถวแต่ละแถวสำหรับจำนวนลบแต่ละค่า ด้านล่างเป็นตัวอย่าง DDL: Create Table #Be ( id int , salesid int , num decimal(16,4) ) Insert Into #BE Values (1, 1, 12.32), (2, 1, -13.00), (3, 1, 14.00) , (4, 2, 12.12), (5, 2, 14.00), (6, 2, 21.23) , (7, 3, -12.32), (8,3, -43.23), (9, 3, -2.32) และนี่คือผลลัพธ์ที่ต้องการของฉัน (จำนวนบวกสำหรับพนักงานขายแต่ละคนSUM()และรายการเชิงลบได้รับการส่งคืนแต่ละบรรทัด): …

2
วิธีใช้ COALESCE กับหลายแถวและไม่มีเครื่องหมายจุลภาคก่อนหน้า
ฉันกำลังพยายามทำสิ่งต่อไปนี้: California | Los Angeles, San Francisco, Sacramento Florida | Jacksonville, Miami น่าเสียดายที่ฉันได้รับ ", Los Angeles, San Francisco, Sacramento, Jacksonville, Miami" ฉันสามารถบรรลุผลลัพธ์ที่ต้องการโดยใช้ฟังก์ชั่น STUFF แต่สงสัยว่ามีวิธีที่สะอาดกว่าในการทำโดยใช้ COALESCE หรือไม่ STATE | CITY California | San Francisco California | Los Angeles California | Sacramento Florida | Miami Florida | Jacksonville DECLARE @col NVARCHAR(MAX); SELECT …
27 sql-server  t-sql 

6
จัดทำดัชนีประสิทธิภาพการทำงานเป็นเปิดเมื่อเทียบกับตำแหน่งที่
ฉันมีสองตาราง @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) ตารางเหล่านี้มีดัชนีที่ไม่ทำคลัสเตอร์ (Id, Date) และฉันเข้าร่วมตารางเหล่านี้ SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date <= GETDATE() AND t2.Date <= GETDATE() สิ่งนี้สามารถเขียนเป็น SELECT * FROM T1 AS …

7
พยายามค้นหาครั้งล่าสุดที่มีการเปลี่ยนแปลงค่า
ฉันมีตารางที่มี ID ค่าและวันที่ มี ID, ค่าและวันที่จำนวนมากในตารางนี้ บันทึกจะถูกแทรกลงในตารางนี้เป็นระยะ ID จะยังคงเหมือนเดิม แต่บางครั้งค่าจะเปลี่ยน ฉันจะเขียนคิวรีที่จะให้ ID พร้อมกับเวลาที่มีการเปลี่ยนแปลงค่าล่าสุดได้อย่างไร หมายเหตุ: ค่าจะเพิ่มขึ้นเสมอ จากข้อมูลตัวอย่างนี้: Create Table Taco ( Taco_ID int, Taco_value int, Taco_date datetime) Insert INTO Taco Values (1, 1, '2012-07-01 00:00:01'), (1, 1, '2012-07-01 00:00:02'), (1, 1, '2012-07-01 00:00:03'), (1, 1, '2012-07-01 00:00:04'), (1, 2, '2012-07-01 00:00:05'), …

9
ทดสอบว่าสตริงเป็น palindrome โดยใช้ T-SQL
ฉันเป็นผู้เริ่มต้นใน T-SQL ฉันต้องการตัดสินใจว่าสตริงอินพุตเป็น palindrome โดยมีเอาต์พุต = 0 หากไม่ใช่และ output = 1 หากเป็น ฉันยังคงหาไวยากรณ์ ฉันไม่ได้รับข้อความแสดงข้อผิดพลาด ฉันกำลังมองหาวิธีแก้ไขปัญหาที่แตกต่างกันและข้อเสนอแนะบางอย่างเพื่อให้ได้ความเข้าใจและความรู้ที่ดีขึ้นเกี่ยวกับวิธีการทำงานของ T-SQL เพื่อให้ทำงานได้ดีขึ้น - ฉันยังเป็นนักเรียนอยู่ ความคิดหลักที่ฉันเห็นคือการเปรียบเทียบอักขระซ้าย - ขวา - ส่วนใหญ่กับแต่ละอื่น ๆ เพื่อตรวจสอบความเท่าเทียมกันจากนั้นไปเปรียบเทียบอักขระที่สองจากด้านซ้ายกับอักขระ 2 จากซ้ายและสุดท้าย เราวนซ้ำ: ถ้าตัวละครมีค่าเท่ากันเราจะดำเนินการต่อ ถ้าเราถึงจุดสิ้นสุดเราจะเอาท์พุท 1 ถ้าไม่เราก็เอาท์พุท 0 คุณช่วยวิจารณ์ได้ไหม: CREATE function Palindrome( @String Char , @StringLength Int , @n Int , @Palindrome BIN , …

3
ทำไม `SELECT @@ IDENTITY 'ถึงส่งกลับทศนิยม
ฉันใช้Dapperเพื่อดำเนินการค้นหาต่อไปนี้กับอินสแตนซ์ SQL Server 2008 R2 Express จากแอปพลิเคชัน ASP.NET MVC 3 (.NET 4.0) INSERT INTO Customers ( Type, Name, Address, ContactName, ContactNumber, ContactEmail, Supplier) VALUES ( @Type, @Name, @Address, @ContactName, @ContactNumber, @ContactEmail, @Supplier) SELECT @@IDENTITY การเรียกร้องให้connection.Query<int>(sql, ...)ส่งการยกเว้น Cast ไม่ถูกต้อง ผมเคยบั๊กมันและมันก็เป็นจุดที่ Dapper เรียกบนกลับGetValueSqlDataReader ชนิดส่งคืนของGetValueคือObjectการตรวจสอบในรายการดีบักเกอร์ซึ่งเป็นทศนิยมแบบกล่อง ถ้าฉันเปลี่ยนการเลือกSELECT CAST(@@IDENTITY as int)เป็นการคืนค่าของ GetValue จะเป็น int แบบกล่องและข้อยกเว้นจะไม่ถูกส่งออกไป …

1
รูปแบบตัวอักษรวันที่ / เวลา LANGUAGE และ DATEFORMAT ปลอดภัยอย่างไร
มันเป็นเรื่องง่ายที่จะแสดงให้เห็นว่าวันที่ / เวลารูปแบบหลายอื่น ๆกว่าสองต่อไปนี้เป็นความเสี่ยงที่จะเข้าใจผิดเนื่องจาก SET ภาษาตลาดหลักทรัพย์ DATEFORMAT หรือภาษาเริ่มต้นการเข้าสู่ระบบของ: yyyyMMdd -- unseparated, date only yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T แม้รูปแบบนี้โดยไม่มี T อาจดูเหมือนรูปแบบ ISO 8601 ที่ถูกต้อง แต่มันล้มเหลวในหลายภาษา: DECLARE @d varchar(32) = '2017-03-13 23:22:21.020'; SET LANGUAGE Deutsch; SELECT CONVERT(datetime, @d); SET LANGUAGE Français; SELECT CONVERT(datetime, @d); ผล: Die Spracheneinstellung …

4
หากฐานข้อมูลมีการแทรกเพียงครั้งเดียวมันจะไม่ดีที่จะทำดัชนีชุดค่าผสมของคอลัมน์ที่เป็นไปได้หรือไม่?
ฉันกำลังทำงานกับระบบการรายงานที่จะต้องใช้แบบสอบถามที่มีขนาดใหญ่ แต่ขึ้นอยู่กับฐานข้อมูลที่กรอกเพียงครั้งเดียว ระบบการจัดการฐานข้อมูลคือ Microsoft SQL Server 2017 อาจมีวิธีที่ดีกว่าในการออกแบบระบบเช่นนี้ ในทางทฤษฎีการพูด: หากเรามีฐานข้อมูลขนาดใหญ่มาก (150M + แถวในหลายตาราง) และเราสามารถสรุปได้ว่าฐานข้อมูลจะถูกบรรจุครั้งเดียว การทำดัชนีทุกชุดคอลัมน์ที่เป็นไปได้มีผลกระทบด้านลบต่อแบบสอบถามแบบใช้เลือกข้อมูลหรือไม่

1
“ No Join Predicate” หมายถึงอะไรใน SQL Server
MSDN "ไม่มีกิจกรรมการเข้าร่วมเพรดิเคตคลาส " บอกว่า " แสดงว่ามีการดำเนินการค้นหาที่ไม่มีภาคแสดงการเข้าร่วม " แต่น่าเสียดายที่มันไม่ง่ายอย่างที่คิด ตัวอย่างเช่นสถานการณ์ที่ง่ายมาก: create table #temp1(i int); create table #temp2(i int); Select * from #temp1, #temp2 option (recompile); ไม่มีข้อมูลในตารางไม่มีคำเตือนอย่างใดอย่างหนึ่งถึงแม้ว่าจะเห็นได้ชัดว่าไม่มีการเข้าร่วมเพรดิเคต ถ้าฉันดูเอกสารประกอบสำหรับ SQL Server 2005 (ลิงก์เดียวกันเพียงแค่รุ่นเซิร์ฟเวอร์อื่น) จะมีประโยคพิเศษ: " เหตุการณ์นี้เกิดขึ้นเฉพาะเมื่อทั้งสองด้านของการเข้าร่วมกลับมามากกว่าหนึ่งแถว " สิ่งนี้จะทำให้ ความรู้สึกที่สมบูรณ์แบบในสถานการณ์ก่อนหน้า ไม่มีข้อมูลดังนั้นทั้งสองฝ่ายจึงคืนค่า 0 แถวและไม่มีการเตือน แทรกแถวรับคำเตือน โอเคดี. แต่สำหรับสถานการณ์ที่สับสนต่อไปฉันจะแทรกค่าเดียวกันในทั้งสองตาราง: Insert into #temp1 (i) values (1) Insert into …

1
ฉันจะตั้งค่าสตริง SQL Unicode / NVARCHAR ของเซิร์ฟเวอร์เป็นอีโมจิหรืออักขระเสริมได้อย่างไร
ฉันต้องการตั้งค่าตัวแปรสตริง Unicode เป็นอักขระเฉพาะตามจุดโค้ด Unicode ฉันต้องการใช้จุดรหัสเกิน 65535 แต่ฐานข้อมูล SQL Server 2008 R2 SQL_Latin1_General_CP1_CI_ASมีการเปรียบเทียบของ ตามเอกสาร NCHAR ไมโครซอฟท์ที่NCHARฟังก์ชั่นใช้เวลาจำนวนเต็มดังนี้ integer_expression เมื่อการเรียงของฐานข้อมูลไม่มีค่าสถานะอักขระเสริม (SC) นี่เป็นจำนวนเต็มบวกตั้งแต่ 0 ถึง 65535 (0 ถึง 0xFFFF) หากระบุค่านอกช่วงนี้ NULL จะถูกส่งคืน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับอักขระเสริมดูที่การเรียงหน้าและการสนับสนุน Unicode เมื่อการเรียงฐานข้อมูลสนับสนุนแฟล็กอักขระเสริม (SC) นี่เป็นจำนวนเต็มบวกตั้งแต่ 0 ถึง 1114111 (0 ถึง 0x10FFFF) หากระบุค่านอกช่วงนี้ NULL จะถูกส่งคืน ดังนั้นรหัสนี้: SELECT NCHAR(128512); ส่งคืนNULLในฐานข้อมูลนี้ ฉันต้องการให้ส่งคืนเช่นนี้: SELECT N'😀'; ฉันจะตั้งค่าตัวแปรสตริง …

1
ทำไม 0 เท่ากับสตริงที่ว่างเปล่า?
ฉันต้องการความช่วยเหลือในการค้นหาสาเหตุที่T-SQLคำสั่งต่อไปนี้ส่งคืน1(จริง): SELECT IIF( 0 = '', 1, 0) ฉันเดาว่ามีคนเปลี่ยนตัวANSIเลือกที่ชอบSET ANSI_NULLSหรืออย่างอื่นที่ทำให้เกิดพฤติกรรม ปัญหาของฉันคือฉันเข้าร่วมค่าบางอย่างและในชุดแถวสุดท้ายฉันมีค่าที่เข้าร่วม0และ''ค่าซึ่งไม่ถูกต้อง

2
นามแฝงของแบบสอบถามย่อยเหมือนกับนามแฝงข้อความค้นหาหลัก
ฉันมีแบบสอบถาม SQL ซึ่งมีชื่อแทนเหมือนกับนามแฝงของแบบสอบถามบางส่วน ตัวอย่างเช่น: select * from ROOM r where ... ( select * from ROAD r where ... ) วิธีนี้ใช้งานได้ดีเนื่องจากนามแฝงของแบบสอบถามย่อยดูเหมือนจะซ่อนตัวหลัก มันจะทำงานแบบนั้นในทุกกรณีหรือไม่? ฉันจะได้รับผลลัพธ์ที่ไม่ได้กำหนดหรือไม่? หากไม่เป็นเช่นนั้นฉันจะอ้างอิงถึงข้อความค้นหาหลักได้rอย่างไร

2
ตำแหน่งของอนุประโยค ON หมายถึงอะไรจริง ๆ ?
JOIN ... ON ...ไวยากรณ์ปกติเป็นที่รู้จักกันดี แต่มันก็เป็นไปได้ที่จะวางตำแหน่งONประโยคแยกจากJOINที่มันสอดคล้องกับ นี่คือสิ่งที่ไม่ค่อยเห็นในทางปฏิบัติไม่พบในบทช่วยสอนและฉันไม่ได้พบแหล่งข้อมูลบนเว็บใด ๆที่แม้แต่กล่าวถึงสิ่งนี้ว่าเป็นไปได้ นี่คือสคริปต์ที่จะเล่นกับ: SELECT * INTO #widgets1 FROM (VALUES (1), (2), (3)) x(WidgetID) SELECT * INTO #widgets2 FROM (VALUES (1, 'SomeValue1'), (2, 'SomeValue2'), (3, 'SomeValue3')) x(WidgetID, SomeValue) SELECT * INTO #widgetProperties FROM (VALUES (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')) x(WidgetID, PropertyName) --q1 SELECT …
23 sql-server  t-sql 

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