คำถามติดแท็ก tsql

T-SQL (ภาษาคิวรีธุรกรรมเชิงโครงสร้าง) เป็นส่วนเสริมของฟังก์ชัน SQL ที่รองรับโดย Sybase ASE และ Microsoft SQL Server อย่าใช้แท็กนี้สำหรับการสืบค้นที่เกี่ยวข้องกับ MySQL, PostgreSql, Oracle (Pl / SQL) โปรดทราบว่ารหัส SQL ที่กำลังเขียนโดยใช้ LINQ จะไม่เป็นส่วนหนึ่งของแท็กนี้ด้วย แท็กนี้สร้างขึ้นโดยเฉพาะสำหรับการเขียนโปรแกรม SQL ขั้นสูงโดยใช้ Microsoft SQL Server

2
สับสนเกี่ยวกับ UPDLOCK, HOLDLOCK
ในขณะที่ค้นคว้าการใช้Table Hintsฉันเจอคำถามสองข้อนี้: ฉันควรใช้คำแนะนำการล็อกใด (T-SQL) HOLDLOCK มีผลอย่างไรต่อ UPDLOCK? คำตอบของทั้งสองคำถามบอกว่าเมื่อใช้(UPDLOCK, HOLDLOCK)กระบวนการอื่น ๆ จะไม่สามารถอ่านข้อมูลบนตารางนั้นได้ แต่ฉันไม่เห็นสิ่งนี้ ในการทดสอบฉันสร้างตารางและเริ่มหน้าต่าง SSMS สองหน้าต่าง จากหน้าต่างแรกฉันรันธุรกรรมที่เลือกจากตารางโดยใช้คำแนะนำตารางต่างๆ ในขณะที่ธุรกรรมกำลังทำงานอยู่จากหน้าต่างที่สองฉันเรียกใช้คำสั่งต่างๆเพื่อดูว่ารายการใดจะถูกบล็อก ตารางทดสอบ: CREATE TABLE [dbo].[Test]( [ID] [int] IDENTITY(1,1) NOT NULL, [Value] [nvarchar](50) NULL, CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, …

5
มีข้อดีกว่า varchar (500) มากกว่า varchar (8000) หรือไม่?
ฉันได้อ่านเรื่องนี้ในฟอรัม MSDN และที่นี่ก็ยังไม่ชัดเจน ฉันคิดว่าถูกต้อง: Varchar (สูงสุด) จะถูกจัดเก็บเป็นประเภทข้อมูลข้อความดังนั้นจึงมีข้อเสีย สมมติว่าฟิลด์ของคุณมีความยาวน้อยกว่า 8000 อักขระได้อย่างน่าเชื่อถือ เช่นเดียวกับเขตข้อมูล BusinessName ในตารางฐานข้อมูลของฉัน ในความเป็นจริงชื่อธุรกิจมักจะต่ำกว่า (ดึงตัวเลขออกจากหมวก) 500 อักขระ ดูเหมือนว่าช่อง varchar จำนวนมากที่ฉันวิ่งข้ามจะลดลงภายใต้จำนวนอักขระ 8k ฉันควรทำให้ฟิลด์นั้นเป็น varchar (500) แทน varchar (8000) หรือไม่? จากสิ่งที่ฉันเข้าใจเกี่ยวกับ SQL ไม่มีความแตกต่างระหว่างสองสิ่งนี้ ดังนั้นเพื่อให้ชีวิตง่ายขึ้นฉันต้องการกำหนดฟิลด์ varchar ทั้งหมดของฉันเป็น varchar (8000) มีข้อบกพร่องหรือไม่? ที่เกี่ยวข้อง: ขนาดของคอลัมน์ varchar (ฉันไม่รู้สึกว่าคนนี้ตอบคำถามของฉัน)
91 sql  sql-server  tsql 

10
SQL Row_Number () ฟังก์ชันใน Where Clause
ฉันพบหนึ่งคำถามที่ตอบด้วยRow_Number()ฟังก์ชันในประโยค where เมื่อฉันลองใช้แบบสอบถามหนึ่งรายการฉันได้รับข้อผิดพลาดต่อไปนี้: "ข่าวสารเกี่ยวกับ 4108 ระดับ 15 สถานะ 1 บรรทัด 1 ฟังก์ชันที่มีหน้าต่างสามารถปรากฏได้เฉพาะในส่วนคำสั่ง SELECT หรือ ORDER BY" นี่คือคำถามที่ฉันพยายาม หากใครรู้วิธีแก้ปัญหานี้โปรดแจ้งให้เราทราบ SELECT employee_id FROM V_EMPLOYEE WHERE row_number() OVER ( ORDER BY employee_id ) > 0 ORDER BY Employee_ID


7
คำสั่ง WHERE บนชนิดข้อมูล "ข้อความ" ของเซิร์ฟเวอร์ SQL
โดยที่ [CastleType] ถูกตั้งค่าเป็นชนิดข้อมูล "text" ใน SQL Server และแบบสอบถามคือ: SELECT * FROM [Village] WHERE [CastleType] = 'foo' ฉันได้รับข้อผิดพลาด: ชนิดข้อมูลTEXTและVARCHARเข้ากันไม่ได้ในตัวดำเนินการเท่ากับ ฉันไม่สามารถสืบค้นข้อมูลประเภทนี้ด้วย WHERE clause ได้หรือไม่?


9
INSERT เทียบกับ INSERT INTO
ฉันทำงานกับ T-SQL ใน MS SQL มาระยะหนึ่งแล้วและเมื่อใดก็ตามที่ฉันต้องแทรกข้อมูลลงในตารางฉันมักจะใช้ไวยากรณ์: INSERT INTO myTable <something here> ฉันเข้าใจว่าคำหลักINTOนั้นเป็นตัวเลือกที่นี่และฉันไม่จำเป็นต้องใช้ แต่อย่างใดมันก็กลายเป็นนิสัยในกรณีของฉัน คำถามของฉันคือ: มีความหมายของการใช้INSERTวากยสัมพันธ์INSERT INTOหรือไม่? ข้อใดเป็นไปตามมาตรฐานอย่างครบถ้วน ทั้งสองอย่างถูกต้องในการใช้งานมาตรฐาน SQL อื่น ๆ หรือไม่?
91 sql  sql-server  tsql 


7
T-SQL: วนลูปผ่านอาร์เรย์ของค่าที่รู้จัก
นี่คือสถานการณ์ของฉัน: สมมติว่าฉันมีกระบวนงานที่เก็บไว้ซึ่งฉันจำเป็นต้องเรียกใช้กระบวนงานอื่นที่เก็บไว้ในชุดของรหัสเฉพาะ มีวิธีทำไหม กล่าวคือแทนที่จะต้องทำสิ่งนี้: exec p_MyInnerProcedure 4 exec p_MyInnerProcedure 7 exec p_MyInnerProcedure 12 exec p_MyInnerProcedure 22 exec p_MyInnerProcedure 19 ทำสิ่งนี้: *magic where I specify my list contains 4,7,12,22,19* DECLARE my_cursor CURSOR FAST_FORWARD FOR *magic select* OPEN my_cursor FETCH NEXT FROM my_cursor INTO @MyId WHILE @@FETCH_STATUS = 0 BEGIN exec p_MyInnerProcedure …
90 sql  sql-server  tsql 

2
ขนาดสูงสุดของตัวแปร varchar (สูงสุด)
เมื่อใดก็ตามที่ผ่านมาหากมีคนถามฉันว่าขนาดสูงสุดของ a varchar(max)ฉันจะบอกว่า 2GB หรือค้นหาตัวเลขที่แน่นอนกว่านี้ (2 ^ 31-1 หรือ 2147483647) อย่างไรก็ตามในการทดสอบล่าสุดฉันพบว่าvarchar(max)ตัวแปรสามารถเกินขนาดนี้ได้: create table T ( Val1 varchar(max) not null ) go declare @KMsg varchar(max) = REPLICATE('a',1024); declare @MMsg varchar(max) = REPLICATE(@KMsg,1024); declare @GMsg varchar(max) = REPLICATE(@MMsg,1024); declare @GGMMsg varchar(max) = @GMsg + @GMsg + @MMsg; select LEN(@GGMMsg) insert into T(Val1) …
90 sql-server  tsql 

1
ฉันจะดึงหลายคอลัมน์เพื่อใช้ในการวนรอบเคอร์เซอร์ได้อย่างไร
เมื่อฉันพยายามเรียกใช้ข้อมูลโค้ด SQL ต่อไปนี้ภายในลูปเคอร์เซอร์ set @cmd = N'exec sp_rename ' + @test + N',' + RIGHT(@test,LEN(@test)-3) + '_Pct' + N',''COLUMN''' ฉันได้รับข้อความต่อไปนี้ ข่าวสารเกี่ยวกับ 15248 ระดับ 11 สถานะ 1 ขั้นตอน sp_rename บรรทัด 213 พารามิเตอร์@objnameไม่ชัดเจนหรืออ้างว่า@objtype(COLUMN) ไม่ถูกต้อง เกิดอะไรขึ้นและฉันจะแก้ไขได้อย่างไร? ฉันลองตัดชื่อคอลัมน์ในวงเล็บ[]และอัญประกาศคู่""เหมือนผลการค้นหาบางรายการที่แนะนำ แก้ไข 1 - นี่คือสคริปต์ทั้งหมด ฉันจะส่งชื่อตารางไปยัง sp เปลี่ยนชื่อได้อย่างไร ฉันไม่แน่ใจว่าจะทำอย่างไรเนื่องจากชื่อคอลัมน์อยู่ในตารางใดตารางหนึ่ง BEGIN TRANSACTION declare @cnt int declare @test nvarchar(128) …

4
ฟังก์ชันพาร์ติชัน COUNT () เป็นไปได้โดยใช้ DISTINCT
ฉันพยายามเขียนสิ่งต่อไปนี้เพื่อให้ได้จำนวน NumUsers ที่แตกต่างกันออกไปทั้งหมดดังนี้: NumUsers = COUNT(DISTINCT [UserAccountKey]) OVER (PARTITION BY [Mth]) สตูดิโอบริหารดูเหมือนจะไม่ค่อยมีความสุขกับเรื่องนี้ ข้อผิดพลาดจะหายไปเมื่อฉันลบDISTINCTคีย์เวิร์ด แต่จะไม่เป็นการนับเฉพาะ DISTINCTดูเหมือนจะไม่เป็นไปได้ภายในฟังก์ชันพาร์ติชัน ฉันจะหาจำนวนที่แตกต่างได้อย่างไร ฉันใช้วิธีการแบบเดิมๆ เช่นการสืบค้นย่อยที่สัมพันธ์กันหรือไม่ เมื่อพิจารณาเพิ่มเติมอีกเล็กน้อยOVERฟังก์ชั่นเหล่านี้อาจทำงานแตกต่างจาก Oracle ในลักษณะที่ไม่สามารถใช้ในSQL-Serverการคำนวณผลรวมที่กำลังทำงานอยู่ ฉันได้เพิ่มตัวอย่างสดที่นี่ในSQLfiddleซึ่งฉันพยายามใช้ฟังก์ชันพาร์ติชันเพื่อคำนวณผลรวมที่กำลังทำงานอยู่

6
การสืบค้นย่อยโดยใช้ Exists 1 หรือ Exists *
ฉันเคยเขียนเช็ค EXISTS ของฉันดังนี้: IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET ColumnsX=ValuesX WHERE Where Columns=@Filters END DBA คนหนึ่งในชีวิตก่อนหน้านี้บอกฉันว่าเมื่อฉันทำEXISTSประโยคให้ใช้SELECT 1แทนSELECT * IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters END สิ่งนี้สร้างความแตกต่างได้จริงหรือ?
89 sql  sql-server  tsql 

6
การคำนวณระยะทางระหว่างสองจุด (ละติจูดลองจิจูด)
ฉันกำลังพยายามคำนวณระยะห่างระหว่างสองตำแหน่งบนแผนที่ ฉันเก็บไว้ในข้อมูลของฉัน: Longitude, Latitude, X POS, Y POS ฉันเคยใช้ตัวอย่างข้อมูลด้านล่างนี้มาก่อน DECLARE @orig_lat DECIMAL DECLARE @orig_lng DECIMAL SET @orig_lat=53.381538 set @orig_lng=-1.463526 SELECT *, 3956 * 2 * ASIN( SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2) + COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180) * POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 …


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