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

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

4
ฉันสามารถเปลี่ยนโครงสร้างตารางในธุรกรรมแล้วย้อนกลับหากมีข้อผิดพลาดได้หรือไม่?
ฉันมีALTER TABLEข้อความบางส่วนที่ฉันใช้อยู่ ไม่ใช่ทั้งหมดที่ทำงาน (เป็นผลมาจากการรันการเปรียบเทียบข้อมูล SQL) และฉันต้องการจัดกลุ่มพวกเขาในบางธุรกรรมและย้อนกลับคำสั่งหากมีสิ่งผิดปกติ เป็นไปได้หรือเป็นเพียงข้อมูลที่สามารถย้อนกลับได้?

3
สร้างฟังก์ชั่นใหม่ด้วยรหัสถ้ามันไม่มีอยู่
ฉันต้องการสร้างฟังก์ชั่นใหม่ตามสคริปต์ในฐานข้อมูลของฉัน รหัสสคริปต์ด้านล่าง: IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End แต่เมื่อฉันรันสคริปต์ข้างต้น SQL Server จะส่งคืนข้อผิดพลาด: 'CREATE FUNCTION' must be the first statement in a query batch.

2
ทำไม“ SELECT POWER (10.0, 38.0);” โยนข้อผิดพลาดทางคณิตศาสตร์มากเกินไป?
ฉันอัปเดตของฉันIDENTITYสคริปต์เช็คล้นไปยังบัญชีสำหรับDECIMALและNUMERIC IDENTITYคอลัมน์ เป็นส่วนหนึ่งของการตรวจสอบฉันคำนวณขนาดของช่วงชนิดข้อมูลสำหรับทุกIDENTITYคอลัมน์ ฉันใช้มันเพื่อคำนวณเปอร์เซ็นต์ของช่วงนั้นหมดไป สำหรับDECIMALและNUMERIC ขนาดของช่วงนั้นเป็น2 * 10^p - 2ที่ที่pมีความแม่นยำ ฉันสร้างกลุ่มตารางทดสอบด้วยDECIMALและNUMERIC IDENTITYคอลัมน์และพยายามคำนวณช่วงดังนี้: SELECT POWER(10.0, precision) FROM sys.columns WHERE is_identity = 1 AND type_is_decimal_or_numeric ; สิ่งนี้ทำให้เกิดข้อผิดพลาดต่อไปนี้: Msg 8115, Level 16, State 6, Line 1 Arithmetic overflow error converting float to data type numeric. ฉัน จำกัด ให้แคบลงไปยังIDENTITYคอลัมน์ประเภทDECIMAL(38, 0)(เช่นด้วยความแม่นยำสูงสุด) ดังนั้นฉันจึงลองPOWER()คำนวณโดยตรงกับค่านั้น แบบสอบถามต่อไปนี้ทั้งหมด SELECT POWER(10.0, …

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 …

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

1
เหตุใด COUNT หลายรายการจึงเร็วกว่าหนึ่ง SUM ด้วย CASE
ฉันอยากรู้ว่าวิธีใดในสองวิธีต่อไปนี้เร็วกว่า: 1) สามCOUNT: SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Approved'), Valid = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Valid'), Reject = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Reject') 2) SUMด้วยFROM--clause: SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE …

1
เราจำเป็นต้องจัดการธุรกรรมในรหัส C # หรือในขั้นตอนการจัดเก็บ
เราจำเป็นต้องมีการจัดการธุรกรรมใน c # หรือไม่รวมถึงการจัดเก็บฐานข้อมูลทั้งสองด้าน ค#: Using(transaction with transaction scope) { Execute stored proc; Transaction. Complete; } โพรซีเดอร์ที่เก็บ SQL: Create process As Begin try Begin transaction Commit End try Begin catch Rollback End catch

4
การเข้าร่วมได้รับการปรับให้เหมาะสมกับส่วนคำสั่งที่ runtime หรือไม่
เมื่อฉันเขียนแบบสอบถามเช่นนี้ ... select * from table1 t1 join table2 t2 on t1.id = t2.id เครื่องมือเพิ่มประสิทธิภาพ SQL ไม่แน่ใจว่าเป็นคำที่ถูกต้องแปลว่าเป็น ... select * from table1 t1, table2 t2 where t1.id = t2.id โดยพื้นฐานแล้วคำสั่งเข้าร่วมใน SQL Server เป็นวิธีที่ง่ายกว่าในการเขียน sql หรือไม่ หรือใช้จริงในเวลาทำงาน? แก้ไข: ฉันเกือบจะตลอดและจะใช้เข้าร่วมไวยากรณ์ ฉันแค่อยากรู้ว่าเกิดอะไรขึ้น

1
บังคับให้สปูลดัชนี
ฉันรู้ว่าบางสิ่งบางอย่างที่ควรหลีกเลี่ยงด้วยเหตุผลด้านประสิทธิภาพ แต่ฉันกำลังพยายามแสดงสภาพที่มันปรากฏเป็นตัวอย่างในการทำให้แน่ใจว่ามันจะไม่ปรากฏขึ้น อย่างไรก็ตามฉันท้ายด้วยคำเตือนดัชนีที่ขาดหายไป แต่เครื่องมือเพิ่มประสิทธิภาพเลือกที่จะไม่สร้างดัชนีชั่วคราว แบบสอบถามที่ฉันใช้คือ SELECT z.a FROM dbo.t5 AS z WITH(INDEX(0)) WHERE EXISTS ( SELECT y.a FROM dbo.t4 AS y WHERE y.a = z.a ) OPTION (MAXDOP 1); แผนผังตารางคือ: CREATE TABLE dbo.t4 ( a integer NULL, b varchar(1000) NULL, p varchar(100) NULL ); CREATE TABLE dbo.t5 ( a integer …

2
ทำธุรกรรม SQL โดยใช้ WITH ใน CREATE VIEW
ฉันต้องการสร้างการดูด้วยการใช้คำสั่ง แต่ไม่พบการอ้างอิงเกี่ยวกับไวยากรณ์ที่ถูกต้องจริงๆ ฉันอยากได้แบบนี้ WITH TempTbl AS (SELECT ...) CREATE VIEW SomeView SELECT * FROM TempTbl และไวยากรณ์ที่ถูกต้องสำหรับการใช้หลายกับคำสั่งคืออะไร? ไม่มีประโยชน์ใน MSDN :(
14 t-sql  view 

2
ทำไม CTE ควรเริ่มต้นด้วยเซมิโคลอน
ฉันแค่ดูโพสต์ในStackOverflowที่ Aaron Bertrand เสนอให้ใช้ CTE แทนตารางตัวเลขซึ่งเป็นวิธีที่ยอดเยี่ยมในการปฏิบัติงานในมือ คำถามของฉันคือทำไมบรรทัดแรกของ CTE เริ่มต้นด้วยเซมิโคลอน ;WITH n AS (SELECT TOP (10000) n FROM (SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ) AS x ORDER BY n ) SELECT n FROM n ORDER BY n; -- look …
14 sql-server  t-sql  cte  syntax 

2
การเรียกคืนหน้าเว็บออนไลน์ที่มีจำนวนการ จำกัด 1,000 ครั้ง
ฉันได้รับมอบหมายให้พยายามกู้คืนฐานข้อมูลที่ประสบจากความเสียหาย (เนื่องจากความล้มเหลวของ I / O ซึ่งได้รับการแก้ไขตั้งแต่) ฉันไม่คุ้นเคยกับฐานข้อมูลหรือสิ่งที่มีอยู่ ฉันได้รับการสำรองข้อมูลเต็มรูปแบบเก่า (~ 3 สัปดาห์) และชุดบันทึกธุรกรรม ... แต่มีบันทึกธุรกรรมขาดหายไปดังนั้นฉันสามารถกู้คืนได้จนถึงวันที่กำหนด ข้อมูลหายไป 2.5 สัปดาห์ (และมีข้อมูลจำนวนมากถูกเพิ่มลงในฐานข้อมูลนี้อย่างต่อเนื่อง) ฉันยังได้รับสำเนาของฐานข้อมูลที่เสียหาย (ซึ่งสามารถเข้าถึงได้ แต่มีหลายหน้าเสียหาย / ขาดหายไป) ฉันได้ลองDBCC CHECKDBคำสั่งทั่วไป(ยังไม่repair_allow_data_lossว่าจะเป็นทางเลือกสุดท้ายของฉันถ้าไม่มีอะไรทำงาน) หลังจากหลายคนมาและไปที่ฐานข้อมูล (db ​​เป็นสัตว์ประหลาดตัวเล็ก ๆ 1.5 เทราไบต์และทุกอย่างที่ฉันทำช้าและใช้เวลาสักครู่) ฉันพยายามทำการกู้คืนหน้าออนไลน์จากการสำรองข้อมูลที่ดีที่รู้จักล่าสุดสำหรับเพจที่เสียหาย ในการทำเช่นนั้นฉันได้ทำสคริปต์ที่สร้างRESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'คำสั่งจำนวนมากจากDBCC CHECKDBผลลัพธ์ (โดยปกติ regex และแตกต่างกันไป) ... ดีมากจนถึงตอนนี้มันใช้งานได้จนถึงจุดที่บอกว่าฉันมีจำนวนหน้าถึง 1,000 หน้า ต่อไฟล์ (มี 8 ไฟล์ใน …

4
% ในอนุประโยคนี้ทำอะไรได้บ้าง
ฉันกำลังฝึกอบรมและสคริปต์ตัวใดตัวหนึ่งมีคำสั่งต่อไปนี้: SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1 ฉันต้องการทราบว่าตัวอย่างข้อมูลนี้มีไว้ในส่วนคำสั่ง WHERE: Col1 % 3 = 1 ฉันทำการวิจัยบนอินเทอร์เน็ตและไม่พบการอ้างอิงเกี่ยวกับคำสั่งนี้
13 sql-server  t-sql 

3
เอาชนะข้อจำกัดความยาวอักขระ LIKE
โดยการอ่านข้อจำกัดความยาวของตัวละคร LIKEที่นี่ดูเหมือนว่าฉันไม่สามารถส่งข้อความที่ยาวเกิน ~ 4000 ตัวอักษรในประโยค LIKE ฉันพยายามดึงแผนแบบสอบถามจากแคชแผนแบบสอบถามสำหรับแบบสอบถามเฉพาะ SELECT * FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?' หากแบบสอบถามภายในLIKEตัวอักษรยาวเกิน 4,000 ตัวอักษรฉันจะได้ผลลัพธ์ 0 ถึงแม้ว่าแบบสอบถามของฉันจะอยู่ในแผนแคช (ฉันคาดหวังอย่างน้อย erorr) มีวิธีแก้ไขปัญหานี้หรือจะทำแตกต่างกันอย่างไร ผมมีข้อสงสัยซึ่งสามารถ> ตัวอักษรที่ยาวนานและมีลักษณะเหมือนที่ฉันไม่สามารถหาพวกเขาด้วย10000LIKE

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