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

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

1
ความแตกต่างระหว่าง“ และ” และ“ &”
ฉันพยายามที่จะเข้าใจลำดับความสำคัญของการดำเนินการทางตรรกะและมีรหัสต่อไปนี้: declare @T bit ='TRUE' declare @F bit ='False' print @T and @F และจะส่งคืนข้อผิดพลาดเป็น ไวยากรณ์ไม่ถูกต้องใกล้กับคำหลัก 'และ' ฉันแทนที่ 'และ' ด้วย '&' และรหัสทำงานอีกครั้ง ทำไมรหัสเดิมไม่ทำงาน ฉันใช้เซิร์ฟเวอร์ SQL
13 sql-server  t-sql 

4
การเปรียบเทียบค่า NULL ด้วยตนเองในตาราง
ฉันมักจะสับสนเกี่ยวกับพฤติกรรม t-sql ลึกลับบางอย่างเช่นต่อไปนี้ -- Create table t and insert values. use tempdb CREATE TABLE dbo.t (a INT NULL); -- insert 3 values INSERT INTO dbo.t values (NULL),(0),(1); GO set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null go -- expect 3 …

3
ไม่ได้ใช้ 512 ไบต์จากหน้าข้อมูล 8 KByte ของ SQL Server
ฉันสร้างตารางต่อไปนี้: CREATE TABLE dbo.TestStructure ( id INT NOT NULL, filler1 CHAR(36) NOT NULL, filler2 CHAR(216) NOT NULL ); จากนั้นสร้างดัชนีคลัสเตอร์: CREATE CLUSTERED INDEX idx_cl_id ON dbo.TestStructure(id); ต่อไปฉันเติมด้วย 30 แถวแต่ละขนาดคือ 256 ไบต์ (ตามประกาศตาราง): DECLARE @i AS int = 0; WHILE @i < 30 BEGIN SET @i = @i + 1; INSERT INTO …

5
ใน SQL Server จะมีวิธีในการกำหนดค่าของพารามิเตอร์ที่ส่งผ่านไปยังกระบวนงานที่เก็บไว้
วิธีหนึ่งในการกำหนดโพรซีเดอร์ที่เก็บไว้ซึ่งเรียกใช้โพรซีเดอร์คือใช้วิธี "การจัดการแบบไดนามิก" เช่น: SELECT sqlText.Text, req.* FROM sys.dm_exec_requests req OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext อย่างไรก็ตามสิ่งนี้จะแสดงเฉพาะข้อความของคำสั่งสร้างของโพรซีเดอร์ที่เก็บไว้ เช่น: CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id เป็นการดีที่ฉันต้องการดูว่าพารามิเตอร์สำหรับกระบวนการทำงานที่ทำให้มันทำงานนานมากสำหรับชุดของพารามิเตอร์ที่ละเมิด มีวิธีทำเช่นนั้นหรือไม่? (ในคำถามนี้ Aaron Bertrandกล่าวถึงInputBuffer DBCCแต่ฉันไม่คิดว่ามันเหมาะสมสำหรับปัญหานี้)

2
ขีดกลางในชื่อคอมพิวเตอร์ของฉันทำให้เกิดข้อผิดพลาด T-SQL
ฉันเป็นนักพัฒนาไม่ใช่ DBA (ซึ่งกำลังแสดงอยู่ฉันกลัว) ฉันพยายามเรียกใช้ Report Builder 3.0 ด้วย SQL Server 2014 Express บนคอมพิวเตอร์ที่บ้านของฉัน (ชื่อJohn-PC) และไม่สามารถเรียกใช้รายงานของฉัน ฉันตั้งใจสร้างคำสั่งผสมผู้ใช้ / การเข้าสู่ระบบของและuser = John-PC login = John-PC\Johnเมื่อฉันพยายามลบรายการด้วย: Drop Login John-PC\John ฉันได้รับข้อผิดพลาด: ไวยากรณ์ไม่ถูกต้องใกล้กับ '-' ฉันคิดว่าปัญหาคือเครื่องหมายขีดคั่นในชื่อคอมพิวเตอร์ของฉัน มีวิธีแก้ไขข้อผิดพลาดทางไวยากรณ์หรือไม่ มีวิธีอื่นในการเปลี่ยนหรือลบผู้ใช้ (ฉันลองดรอปจากsys.server_principalsแต่ได้รับข้อผิดพลาดที่ไม่สามารถทำการเปลี่ยนแปลงเฉพาะกิจได้) ฉันสามารถให้ชื่อผู้ใช้ / ชื่อเข้าสู่ระบบใหม่กับ Report Builder ได้หรือไม่ หากไม่มีการข้างต้นฉันสามารถเปลี่ยนชื่อคอมพิวเตอร์เป็นJohn_PCหรือจะสร้างโฮสต์ของปัญหาอื่น ๆ ที่ฉันไม่สามารถจินตนาการได้หรือไม่

2
ฉันจะทำให้ sp_BlitzIndex ของ Brent Ozar ทำงานบน Azure ได้อย่างไร
ฉันดาวน์โหลด SQL Server First Aid Kit จากเว็บไซต์ของ Brent Ozar เมื่อฉันพยายามเรียกใช้สคริปต์sp_BlitzIndexกับฐานข้อมูลหลักของฉันผ่าน Microsoft SQL Server จัดการ Studio ขณะที่เข้าสู่ระบบในฐานะผู้ดูแลระบบเซิร์ฟเวอร์ฐานข้อมูล Azure และฉันได้รับข้อผิดพลาดดังต่อไปนี้: ข่าวสารเกี่ยวกับ 262, ระดับ 14, สถานะ 18, กระบวนงาน sp_BlitzIndex, บรรทัด 18 สร้างสิทธิ์ในการสร้างกระบวนการปฏิเสธในฐานข้อมูล 'ต้นแบบ' ฉันสร้างขั้นตอนบนฐานข้อมูลอินสแตนซ์ที่ฉันต้องการทดสอบเรียบร้อยแล้ว เมื่อฉันดำเนินการตามขั้นตอนฉันพบข้อผิดพลาด: เกี่ยวกับข่าวสาร 50000 ระดับ 16 สถานะ 1 บรรทัด 1265 ชื่อวัตถุไม่ถูกต้อง 'mydatabase.sys.partitions' ต่อไปฉันพยายามที่จะฉลาดและเรียกใช้รหัสกระบวนงานที่เก็บไว้โดยตรงกับฐานข้อมูลหลักโดยไม่ต้องสร้างกระบวนงานที่เก็บไว้และได้รับข้อผิดพลาดต่อไปนี้: ข่าวสารเกี่ยวกับ 50000, ระดับ 15, สถานะ 1, บรรทัด …

1
การกู้คืนฐานข้อมูล SQL Server 2012 ในสภาพพร้อมใช้งานสูง
ฉันมีฐานข้อมูลที่อยู่ในโหมดความพร้อมใช้งานสูงตลอดเวลาที่ซิงโครไนซ์กับฐานข้อมูลอื่นในอินสแตนซ์อื่น ฉันจะคืนค่าจาก.bakไฟล์ไปยังฐานข้อมูลหลักโดยใช้T-SQLอย่างไร ฉันยังใหม่กับความพร้อมใช้งานสูงและฉันได้รับคำแนะนำว่าฉันจำเป็นต้องลบฐานข้อมูลออกจากความพร้อมใช้งานสูงก่อนที่ฉันจะสามารถกู้คืนได้ ฉันหวังว่าฉันจะสามารถกู้คืนตรงไปยังหลักในขณะที่AlwaysOnยังคงเปิดใช้งานและมันจะซิงค์อัตโนมัติกับรอง

3
วิธีรับค่า non-null ล่าสุดในคอลัมน์ที่เรียงลำดับของตารางขนาดใหญ่ได้อย่างไร
ฉันมีอินพุตต่อไปนี้: id | value ----+------- 1 | 136 2 | NULL 3 | 650 4 | NULL 5 | NULL 6 | NULL 7 | 954 8 | NULL 9 | 104 10 | NULL ฉันคาดหวังผลลัพธ์ต่อไปนี้: id | value ----+------- 1 | 136 2 | 136 3 | 650 4 …

3
ซ่อนเลือกเอาต์พุตจาก T-SQL
ฉันพยายามรับเวลาประมวลผลแบบสอบถาม แต่ฉันต้องการซ่อนผลลัพธ์คิวรีด้วย ฉันแค่ต้องการเวลาที่ผ่านไป - ไม่มีเอาต์พุต ตัวอย่าง DECLARE @Start datetime DECLARE @End datetime SELECT @StartTimeWA=GETDATE() SELECT [id] ,[database_id] ,[proc_name] ,[exec_t] from [DB].[dbo].[STAT] SELECT @End=GETDATE() SELECT DATEDIFF(MS,@Start,@End) AS [Duration] ในขณะนี้ฉันได้รับผลลัพธ์ของแบบสอบถามและที่ด้านล่างระยะเวลาของฉันซึ่งเป็นสิ่งเดียวที่ฉันต้องการเท่าที่ผลผลิตจะไป ฉันไม่สามารถทำสิ่งนี้และสงสัยว่ามีคนอื่นเจอปัญหาที่คล้ายกันหรือไม่ นี่คือสิ่งที่ฉันต้องการทำใน T-SQL ไม่ใช่ Management Studio หรืออะไรทำนองนั้น ฉันพยายามตรวจสอบเวลาที่ใช้ในการเรียกใช้คำสั่ง select และรายงานกลับไปที่เซิร์ฟเวอร์ ฉันมีเซิร์ฟเวอร์มอนิเตอร์ภายนอกซึ่งจะทำงานทุกนาทีและได้รับเวลาย้อนกลับ (ระยะเวลาที่ใช้) ซึ่งฉันจะใช้เมื่อเวลาผ่านไปแนวโน้ม / พื้นฐาน ในขณะที่การสืบค้นปัจจุบันแยกแยะผลลัพธ์ที่เลือกและระยะเวลาของฉันมันจะลื่นและเซิร์ฟเวอร์จอภาพของฉันก็สับสน ฉันต้องการคอลัมน์ระยะเวลา ฉันจะทำเช่นนี้เพื่อแทรกซึ่งจะตรงไปตรงมาเพราะมันไม่จำเป็นต้องเลือก ฉันพยายามที่จะทำเช่นนี้ได้อย่างหมดจดใน T-SQL ฉันไม่ต้องการใช้ DMV …
13 sql-server  t-sql 

1
วิธีใช้ COLUMNS_UPDATED เพื่อตรวจสอบว่ามีการอัปเดตคอลัมน์ใดคอลัมน์หนึ่งหรือไม่
ฉันมีตารางที่มี 42 คอลัมน์และทริกเกอร์ซึ่งควรทำบางสิ่งเมื่อมีการอัปเดต 38 คอลัมน์เหล่านี้ ดังนั้นฉันต้องข้ามตรรกะหากส่วนที่เหลือ 4 คอลัมน์มีการเปลี่ยนแปลง ฉันสามารถใช้ฟังก์ชั่นUPDATE ()และสร้างIFเงื่อนไขที่ยิ่งใหญ่ได้แต่ต้องการทำสิ่งที่สั้นกว่า ใช้COLUMNS_UPDATEDฉันสามารถตรวจสอบว่าคอลัมน์ทั้งหมดมีการปรับปรุงได้หรือไม่ ตัวอย่างเช่นการตรวจสอบว่ามีการอัปเดตคอลัมน์ 3, 5 และ 9 หรือไม่: IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) PRINT 'Columns 3, 5 and 9 updated'; ดังนั้นค่า20สำหรับคอลัมน์3และ5และค่า1สำหรับคอลัมน์9เนื่องจากถูกตั้งค่าในบิตแรกของไบต์ที่สอง หากฉันเปลี่ยนคำสั่งORเป็นจะตรวจสอบว่าคอลัมน์3และ5หรือคอลัมน์9นั้นมีการ / มีการปรับปรุง? จะใช้ORตรรกะในบริบทของหนึ่งไบต์ได้อย่างไร

1
SQL Server / T-SQL รองรับความต่อเนื่องของบรรทัดเพื่อแยกสตริงที่ยาวหรือไม่?
บางครั้งฉันมีสคริปต์ SQL ที่มีอย่างน้อยหนึ่งสตริงที่ยาวเป็นพิเศษ (บางครั้งก็ยิ่งยาว) โดยทั่วไปสิ่งเหล่านี้เป็นVARBINARYตัวอักษร / ค่าคงที่ที่เป็นตัวแทนของไฟล์ / แอสเซมบลี แต่บางครั้งพวกเขาก็เป็นข้อความ ปัญหาหลักของสายอักขระที่ยาวมาก ๆ คือตัวแก้ไขข้อความบางตัวไม่สามารถจัดการได้ทั้งหมด ตัวอย่างเช่นฉันมีVARBINARYตัวอักษรที่ฉันใช้ในCREATE ASSEMBLY [AssemblyName] FROM 0x....คำสั่งและแอสเซมบลีตัวเองมีขนาดเพียง 1 MB ซึ่งเท่ากับเพียง 2 ล้านอักขระในไฟล์ข้อความเนื่องจากแต่ละไบต์ต้องการอักขระสองตัวที่จะแสดงในรูปแบบเลขฐานสิบหก (เช่น0x1F= a 1และ an F) SQL Server Management Studio (SSMS) จัดการได้ไม่ดีและค้างนานหลายวินาทีในขณะที่ฉันพยายามเลื่อนข้ามบรรทัดนั้น และในความเป็นจริงแล้วบางเวอร์ชั่น (ไม่แน่ใจว่ายังคงเกิดขึ้น) จะแสดงคำเตือนเกี่ยวกับบรรทัดยาวเมื่อเปิดสคริปต์ที่มีอย่างน้อยหนึ่งบรรทัดในระยะเวลาที่กำหนด ปัญหาที่สองคือมันซับซ้อนการจัดรูปแบบเมื่อใช้ในการแก้ไขโดยไม่ต้องเปิดใช้งานการตัดคำหรือโพสต์ออนไลน์ ปัญหาที่นี่คือตัวเลื่อนสำหรับแถบเลื่อนแนวนอนแคบมากและเคลื่อนย้ายได้แม้เพียงเล็กน้อยก็จะเลื่อนข้อความที่ไม่ยาวมากออกไปให้พ้น ตอนนี้ T-SQL จะไม่ยกเลิกคำสั่งด้วยบรรทัดใหม่หรือแม้แต่เซมิโคลอน (แม้ว่าเซมิโคลอนนั้นจะเป็นที่ต้องการ / แนะนำโดยเริ่มจาก SQL Server 2005) ดังนั้นเนื่องจาก SQL …


3
เหตุใดจึงต้องใช้ master เพื่อสร้างฐานข้อมูล
ฉันมีคำถามสั้น ๆ เหตุใดฉันจึงใช้use master;เพื่อสร้างฐานข้อมูล นี่คือตัวอย่างจากเอกสารของ Microsoft USE master ; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\Program Files\...\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'C:\Program Files\...\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = …

2
MERGE กับ OUTPUT ดีกว่า INSERT และ SELECT แบบมีเงื่อนไขหรือไม่?
เรามักจะพบกับสถานการณ์ "หากไม่มีอยู่แทรก" บล็อกของ Dan Guzmanมีการตรวจสอบที่ยอดเยี่ยมเกี่ยวกับวิธีทำให้เธรดกระบวนการนี้ปลอดภัย SEQUENCEผมมีตารางพื้นฐานที่เพียงแคตตาล็อกสตริงจำนวนเต็มจากที่ ในกระบวนงานที่เก็บไว้ฉันต้องได้รับคีย์จำนวนเต็มสำหรับค่าหากมีอยู่หรือINSERTจากนั้นรับค่าผลลัพธ์ มีข้อ จำกัด ที่ไม่ซ้ำกันในdbo.NameLookup.ItemNameคอลัมน์ดังนั้นความถูกต้องของข้อมูลจึงไม่มีความเสี่ยง แต่ฉันไม่ต้องการพบข้อยกเว้น มันไม่ใช่IDENTITYดังนั้นฉันไม่สามารถรับSCOPE_IDENTITYและคุณค่าอาจเป็นNULLในบางกรณี ในสถานการณ์ของฉันฉันต้องจัดการกับINSERTความปลอดภัยบนโต๊ะเท่านั้นดังนั้นฉันจึงพยายามตัดสินใจว่าควรใช้MERGEแบบนี้ดีกว่า: SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item …

5
วิธีการซ่อน / ปิดการใช้งานตารางโดยไม่ต้องวางเพื่อตรวจสอบความซ้ำซ้อน?
ฉันต้องรักษาและขยายระบบเดิมซึ่งมีวิธีการบริการเว็บและตารางฐานข้อมูลที่ไม่ได้ใช้อีกต่อไป เนื่องจากฉันไม่แน่ใจว่าตารางซ้ำซ้อนจริง ๆ ฉันกลัวที่จะทิ้งมัน มีวิธีอื่นที่จะทำให้ได้ผลที่เหมือนกัน (ไม่สามารถใช้ตารางได้อีกต่อไป) โดยไม่ทิ้งมันไว้? ความคิดของฉันคือการถ่ายโอนไปยังคีมาที่แตกต่างกัน (เช่นDeleted) dboจากค่าเริ่มต้นปัจจุบัน IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted') BEGIN EXEC('CREATE SCHEMA Deleted') END ALTER SCHEMA Deleted TRANSFER dbo.TableName; มีตัวเลือกอื่น ๆ หรือมีข้อเสียเปรียบกับวิธี schema?

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