คุณสมบัติที่ซ่อนของ SQL Server


215

SQL Serverมีฟีเจอร์ที่ซ่อนไว้อะไรบ้าง?

ตัวอย่างเช่นระบบที่ไม่มีเอกสารจัดเก็บขั้นตอน, เทคนิคในการทำสิ่งที่มีประโยชน์มาก แต่ไม่ได้บันทึกไว้เพียงพอหรือไม่


คำตอบ

ขอบคุณทุกคนสำหรับคำตอบที่ยอดเยี่ยม!

ขั้นตอนการจัดเก็บ

  • sp_msforeachtable:เรียกใช้คำสั่งด้วย '?' แทนที่ด้วยชื่อตารางแต่ละรายการ (v6.5 ขึ้นไป)
  • sp_msforeachdb:เรียกใช้คำสั่งด้วย '?' แทนที่ด้วยชื่อฐานข้อมูลแต่ละชื่อ (v7 ขึ้นไป)
  • sp_who2:เหมือนกับ sp_who แต่มีข้อมูลมากขึ้นสำหรับการแก้ปัญหาบล็อก (v7 ขึ้นไป)
  • sp_helptext:หากคุณต้องการรหัสของกระบวนงานที่เก็บไว้ให้ดู & UDF
  • sp_tables:ส่งคืนรายการตารางทั้งหมดและมุมมองของฐานข้อมูลในขอบเขต
  • sp_stored_procedures:ส่งคืนรายการของโพรซีเดอร์ที่เก็บไว้ทั้งหมด
  • xp_sscanf:อ่านข้อมูลจากสตริงลงในตำแหน่งอาร์กิวเมนต์ที่ระบุโดยอาร์กิวเมนต์แต่ละรูปแบบ
  • xp_fixeddrives::ค้นหาไดรฟ์แบบคงที่ที่มีพื้นที่ว่างมากที่สุด
  • sp_help:หากคุณต้องการทราบโครงสร้างตารางดัชนีและข้อ จำกัด ของตาราง นอกจากนี้ยังมีมุมมองและ UDF ทางลัดคือ Alt + F1

เกร็ดเล็กเกร็ดน้อย

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

ฟังก์ชั่น

  • HashBytes ()
  • EncryptByKey
  • คำสั่ง PIVOT

อื่น ๆ

  • สตริงการเชื่อมต่อพิเศษ
  • TableDiff.exe
  • ทริกเกอร์สำหรับเหตุการณ์การเข้าสู่ระบบ (ใหม่ใน Service Pack 2)
  • การเพิ่มประสิทธิภาพด้วยคอลัมน์ที่คำนวณได้ (pcc)
  • การตั้งค่า DEFAULT_SCHEMA ใน sys.database_principles
  • การบังคับใช้พารามิเตอร์
  • รูปแบบการจัดเก็บ Vardecimal
  • การค้นหาข้อความค้นหายอดนิยมในไม่กี่วินาที
  • ฐานข้อมูลที่ใช้ร่วมกันที่ปรับขนาดได้
  • ตาราง / คุณสมบัติตัวกรองกระบวนงานที่เก็บไว้ใน SQL Management Studio
  • ติดตามแฟล็ก
  • ตัวเลขหลังจากGOทำซ้ำแบทช์
  • ความปลอดภัยโดยใช้สกีมา
  • การเข้ารหัสโดยใช้ฟังก์ชั่นการเข้ารหัสมุมมองและตารางพื้นฐานพร้อมกับทริกเกอร์

4
หากเป็นที่รู้จักจะเป็นการดีที่จะรวมเวอร์ชันที่เกี่ยวข้องกับคำตอบแต่ละข้อ (เฉพาะ 2,000 และขึ้นไป, 2005, 2000 เท่านั้น)
bw

คำถามนี้มีคุณความดีมากมาย โปรดอย่าลบมัน! :-)
Sklivvz

คำตอบ:


91

ใน Management Studio คุณสามารถใส่ตัวเลขหลังตัวทำเครื่องหมายสิ้นสุดแบทช์ GO เพื่อทำให้แบทช์ซ้ำหลายครั้ง:

PRINT 'X'
GO 10

จะพิมพ์ 'X' 10 ครั้ง สิ่งนี้สามารถช่วยคุณไม่ให้คัดลอก / วางที่น่าเบื่อเมื่อทำสิ่งที่ซ้ำซ้อน


70

นักพัฒนา SQL Server จำนวนมากยังไม่รู้เกี่ยวกับคำสั่ง OUTPUT (SQL Server 2005 และใหม่กว่า) ในคำสั่ง DELETE, INSERT และ UPDATE

มันจะมีประโยชน์อย่างมากที่จะรู้ว่าแถวใดถูก INSERTed, UPDATEd, หรือ DELETEd และอนุประโยค OUTPUT อนุญาตให้ทำสิ่งนี้ได้อย่างง่ายดาย - มันอนุญาตให้เข้าถึงตาราง "เสมือน" ที่เรียกinsertedและdeleted(เช่นในทริกเกอร์):

DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)

หากคุณกำลังแทรกค่าลงในตารางที่มีเขตข้อมูลคีย์หลัก INT IDENTITY ด้วยส่วนคำสั่ง OUTPUT คุณสามารถรับ ID ใหม่ที่แทรกได้ทันที:

INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)

และหากคุณกำลังอัปเดตอาจเป็นประโยชน์อย่างยิ่งที่จะทราบว่ามีการเปลี่ยนแปลงอะไรบ้างในกรณีนี้insertedแสดงถึงค่าใหม่ (หลังจาก UPDATE) ในขณะที่deletedอ้างอิงถึงค่าเก่าก่อน UPDATE:

UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)

หากข้อมูลจำนวนมากถูกส่งคืนเอาต์พุตของ OUTPUT ยังสามารถเปลี่ยนเส้นทางไปยังตารางชั่วคราวหรือตัวแปรตาราง ( OUTPUT INTO @myInfoTable)

มีประโยชน์อย่างยิ่ง - และเป็นที่รู้จักน้อยมาก!

มาร์ค


52

sp_msforeachtable: เรียกใช้คำสั่งด้วย '?' แทนที่ด้วยชื่อตารางแต่ละรายการ เช่น

exec sp_msforeachtable "dbcc dbreindex('?')"

คุณสามารถออกคำสั่งได้สูงสุด 3 คำสั่งสำหรับแต่ละตาราง

exec sp_msforeachtable
    @Command1 = 'print ''reindexing table ?''',
    @Command2 = 'dbcc dbreindex(''?'')',
    @Command3 = 'select count (*) [?] from ?'

นอกจากนี้ sp_MSforeachdb


2
คุณสามารถรับชื่อของตารางในแบบสอบถามโดยใช้เครื่องหมายคำพูดเดี่ยวรอบเครื่องหมายคำถาม sp_msforeachtable "เลือกจำนวน (*), '?' เป็น tabenm จากไหน "
โจดี้

51

สตริงการเชื่อมต่อพิเศษ:

MultipleActiveResultSets = true;

สิ่งนี้ทำให้ ADO.Net 2.0 ขึ้นไปเป็นชุดผลลัพธ์การอ่านหลาย ๆ แบบไปข้างหน้าอ่านอย่างเดียวบนการเชื่อมต่อฐานข้อมูลเดียวซึ่งสามารถปรับปรุงประสิทธิภาพหากคุณกำลังอ่านมาก คุณสามารถเปิดใช้งานแม้ว่าคุณจะใช้ชนิดข้อความค้นหาผสมกัน

แอปพลิเคชัน = MyProgramName

ตอนนี้เมื่อคุณต้องการดูรายการการเชื่อมต่อที่ใช้งานอยู่โดยการสอบถามตาราง sysprocesses ชื่อโปรแกรมของคุณจะปรากฏในคอลัมน์ program_name แทนที่จะเป็น ".Net SqlClient Data Provider"


7
ฉันต้องการชื่อแอปพลิเคชันที่ บริษัท ของฉัน แอปใหม่ทุกคนต้องมีชื่อที่ไม่ซ้ำกัน ทำให้การติดตามแอปใดถูกล็อค / ทำลายบางสิ่งได้ง่ายขึ้นมาก
นีล N

2
ชื่อแอปพลิเคชันยังมีอยู่ในตัวกรองในตัวสร้างโปรไฟล์ มันช่วยได้มากหากคุณต้องการเห็นเฉพาะการสืบค้นของคุณและไม่ใช่การสอบถามของเพื่อนร่วมงานของคุณ
งัด F

33

TableDiff.exe

  • เครื่องมือความแตกต่างของตารางช่วยให้คุณค้นหาและกระทบยอดความแตกต่างระหว่างตารางต้นทางและปลายทางหรือมุมมอง Tablediff Utility สามารถรายงานความแตกต่างของสคีมาและข้อมูลได้ คุณลักษณะที่นิยมมากที่สุดของ tablediff คือข้อเท็จจริงที่ว่ามันสามารถสร้างสคริปต์ที่คุณสามารถเรียกใช้บนปลายทางที่จะกระทบยอดความแตกต่างระหว่างตาราง

ลิงค์


31

เทคนิค TSQL ที่เป็นที่รู้จักน้อยกว่าสำหรับการส่งคืนแถวตามลำดับแบบสุ่ม:

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())

6
เหมาะสำหรับชุดผลลัพธ์ขนาดเล็ก ฉันจะไม่ใช้มันบนโต๊ะที่มีแถวมากกว่า 10,000 แถวเว้นแต่คุณจะมีเวลาว่าง
John Sheehan

ฉันใช้มันบนโต๊ะที่ใหญ่กว่านั้นมากและมันก็ไม่ช้าเกินไป
มิทช์ข้าวสาลี

จุดประสงค์ในการตรวจสอบ () คืออะไร? คุณสามารถสั่งซื้อโดยเพียงแค่ NEWID ()
Jonas Lincoln

6
ฉันเคยเห็นผลลัพธ์ที่น่าพอใจใน 100,000,000 แถว (100 ล้านบาท) โดยไม่มี CHECKSUM () นอกจากนี้ฉันต้องถามเช่นกันทำไมไม่เพียงแค่สั่งซื้อโดย NEWID
Troy DeMonbreun

5
@GateKiller: ฉันย้อนกลับการแก้ไขของคุณเพราะ Checksum () ไม่ใช่ข้อผิดพลาด มันลดขนาดของคอลัมน์เรียงลำดับ
Mitch Wheat

30

ใน Management Studio คุณสามารถรับรายการคอลัมน์ที่คั่นด้วยจุลภาคสำหรับตารางได้อย่างรวดเร็วโดย:

  1. ใน Object Explorer ให้ขยายโหนดภายใต้ตารางที่กำหนด (ดังนั้นคุณจะเห็นโฟลเดอร์สำหรับคอลัมน์คีย์ข้อ จำกัด ทริกเกอร์ ฯลฯ )
  2. ชี้ไปที่โฟลเดอร์คอลัมน์และลากไปยังคิวรี

สิ่งนี้มีประโยชน์เมื่อคุณไม่ต้องการใช้รูปแบบชั่วร้ายที่ส่งคืนโดยการคลิกขวาบนตารางและเลือกตารางสคริปต์เป็น ... จากนั้นแทรกไปที่ ... เคล็ดลับนี้ใช้งานได้กับโฟลเดอร์อื่น ๆ รายการชื่อที่คั่นด้วยจุลภาคภายในโฟลเดอร์


23

ตัวสร้างแถว

คุณสามารถแทรกข้อมูลหลายแถวด้วยคำสั่งแทรกเดียว

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')

ฉันโหวตสิ่งนี้แล้ว แต่ลองใช้มันใน MSSQL 2005 และมันใช้งานไม่ได้ 2551 เท่านั้น?
richardtallent

11
ใช่มันเป็นคุณลักษณะใหม่ของปี 2008
ร็อบเบิก

2
นี่เป็นคุณสมบัติที่ฉันพลาดเมื่อฉันมาจาก DB2 ไปยัง SQL Server ใน DB2 มีการปรับปรุงความเร็วอย่างมีนัยสำคัญเมื่อใช้สิ่งนี้แทนการใช้คำสั่งแทรกเดี่ยว
Nathan Koop

22

หากคุณต้องการทราบโครงสร้างตารางดัชนีและข้อ จำกัด :

sp_help 'TableName'

รวมเคล็ดลับนี้เข้ากับคีย์ลัด! ก่อนไฮไลต์แท็บเล็ตจากนั้นกด ALT + F1
Michael J Swart

22

HashBytes ()เพื่อส่งคืนแฮช MD2, MD4, MD5, SHA หรือ SHA1 ของอินพุต


ทำได้ดีนี่! ลิงก์ที่ถูกต้องคือmsdn.microsoft.com/en-us/library/ms174415(SQL.90).aspx (รุ่น 2005)
Sklivvz

คุณพูดถูกว่าเป็นเอกสารฉบับปี 2008 ถึงแม้ว่าหน้าเอกสารจะเหมือนกันหมด แก้ไขแล้ว
Joel Coehoorn

20

การค้นหาข้อความค้นหายอดนิยม

  • ด้วย sys.dm_exec_query_stats คุณสามารถคำนวณชุดค่าผสมของการวิเคราะห์แบบสอบถามด้วยแบบสอบถามเดียว

เชื่อมโยง กับ commnad

select * from sys.dm_exec_query_stats 
order by execution_count desc

17

ผลเชิงพื้นที่แท็บสามารถใช้ในการสร้างงานศิลปะ

ป้อนคำอธิบายลิงก์ที่นี่ http://michaeljswart.com/wp-content/uploads/2010/02/venus.png


7
ฉันเห็นพระเยซูในผลการสืบค้นของฉัน!
P พ่อ

6
Pfff ... สิ่งที่ทำให้เสียเวลายุ่งกับแท็บผลเชิงพื้นที่ โอ้รอ ... คุณรู้ไหมฉันคิดว่าโพสต์นั้นดูคุ้นเคยแล้วตอนนี้ฉันจำได้ว่าทำไม
Michael J Swart

16

ยกเว้นและเชื่อมต่อ

แทนที่จะเขียนการรวมที่ซับซ้อนและคำค้นหาย่อยคำหลักสองคำนี้เป็นวิธีที่ย่อและอ่านได้ง่ายกว่าเพื่อแสดงเจตนาของการสืบค้นเมื่อเปรียบเทียบผลลัพธ์การสืบค้นสองแบบ ใหม่ ณ วันที่ของ SQL Server 2005 พวกเขาเสริมยูเนี่ยนที่มีอยู่แล้วในภาษา TSQL มานานหลายปี

แนวคิดของ EXCEPT, INTERSECT และ UNION เป็นพื้นฐานในทฤษฎีเซตซึ่งทำหน้าที่เป็นพื้นฐานและรากฐานของการสร้างแบบจำลองเชิงสัมพันธ์ที่ใช้โดย RDBMS สมัยใหม่ทั้งหมด ตอนนี้ผลลัพธ์ประเภทไดอะแกรมของเวนน์สามารถสร้างได้ง่ายขึ้นโดยใช้ TSQL


16

ฉันรู้ว่ามันไม่ได้ถูกซ่อนไว้อย่างแน่นอน แต่มีคนไม่มากที่รู้เกี่ยวกับคำสั่งPIVOT ฉันสามารถเปลี่ยนโพรซีเดอร์ที่เก็บไว้ซึ่งใช้เคอร์เซอร์และใช้เวลา 2 นาทีในการรันโค้ดที่รวดเร็ว 6 วินาทีซึ่งเป็นหนึ่งในสิบของจำนวนบรรทัด!


16

มีประโยชน์เมื่อกู้คืนฐานข้อมูลเพื่อการทดสอบหรืออะไรก็ตาม แมป ID ล็อกอินใหม่อย่างถูกต้อง:

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'

ฉันมี proc นี้ไม่ทำงานมาก่อนและฉันต้องเปลี่ยนความเป็นเจ้าของวัตถุให้กับผู้ใช้ชั่วคราวปล่อยผู้ใช้เดิมใส่ต้นฉบับลงไปอีกครั้งและโอนสิทธิ์การเป็นเจ้าของกลับคืน อืม ...
StingyJack

15

ปล่อยการเชื่อมต่อทั้งหมดไปยังฐานข้อมูล:

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

มีหนึ่งซับหรือพารามิเตอร์ฐานข้อมูลแบบหล่นที่ทำสิ่งนี้สำหรับฉัน ฉันสังเกตว่าถ้าคุณพยายาม 'ลบฐานข้อมูล' ผ่านทาง UI มีช่องทำเครื่องหมายสำหรับ 'ปิดการเชื่อมต่อที่มีอยู่' ซึ่งแสดงว่าเป็นพารามิเตอร์บูลีน
DevinB

1
ที่จริงฉันเพิ่งพบโซลูชันสองบรรทัด แก้ไขฐานข้อมูล [@ database_name @] ยกเลิกการเชื่อมต่อ SET READ_ONLY ด้วย Rollback ทันที --This ผู้ใช้ทุกคนแก้ไขฐานข้อมูล [@ database_name @] SET READ_WRITE ด้วย Rollback ทันที DROP DATABASE [@ database_name @]
DevinB

1
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATEจะป้องกันไม่ให้มีการเชื่อมต่อใหม่เกิดขึ้นเช่นกัน
ErikE

15

ตรวจสอบตาราง

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)

ตรวจสอบแถว

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value

2
สิ่งเหล่านี้ช่วยให้คุณสามารถสร้างการตรวจสอบสำหรับข้อมูลทั้งหมดในตาราง มันเป็นวิธีที่ง่ายและรวดเร็วในการตรวจสอบว่าสองแถวหรือสองตารางเหมือนกัน
GateKiller

15

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

ตัวอย่าง:

DECLARE @nvcConcatonated nvarchar(max)
SET @nvcConcatonated = ''

SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', '
FROM tblCompany C
WHERE C.CompanyID IN (1,2,3)

SELECT @nvcConcatonated

ผล:

Acme, Microsoft, Apple,

2
คุณยังสามารถใช้ COALESCE () เพื่อทำสิ่งเดียวกันโดยไม่จำเป็นต้องเริ่มต้นตัวแปร SELECT @nvcConcatonated = COALESCE (@nvcConcatonated + ',', '') + CAST (C.CompanyName เป็น VARCHAR (255)) จาก ...
Christopher Klein

สิ่งนี้ยังใช้งานได้ในคำสั่งการอัพเดต บางครั้งมีประโยชน์สำหรับการทำสิ่งต่าง ๆ เช่นการเชื่อมโยงรายการ ID ที่อัปเดต
EBarr

14

หากคุณต้องการรหัสของกระบวนงานที่เก็บไว้คุณสามารถ:

sp_helptext 'ProcedureName'

(ไม่แน่ใจว่ามันเป็นคุณสมบัติที่ซ่อนอยู่หรือไม่ แต่ฉันใช้มันตลอดเวลา)


ไม่ทราบว่าทำไม แต่เอาต์พุต sp_helptext เป็นเรื่องเล็กน้อยในบรรทัดที่ยาวเกินไปในต้นฉบับ เมื่อสคริปต์ Sprocs สิ่งนี้ไม่เกิดขึ้นดังนั้นอาจมีกลไกการส่งออกอื่นที่แข็งแกร่งกว่าหรือไม่ sp_helptext 'MyView' ก็มีประโยชน์เช่นกัน
Kristen

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร สำหรับผมรหัสสำนักจะ outputed ที่มีรูปแบบเดียวกันที่ผมได้สคริปต์ไว้ในไฟล์ต้นฉบับ (กับ CRs ทั้งหมด ฯลฯ )
Eduardo Molteni

ฉันไม่จำรายละเอียดที่แน่นอนแต่เกี่ยวข้องกับวิธีการจัดเก็บข้อความ - บางอย่างเกี่ยวกับขนาดหน้ากระดาษฉันเชื่อ เอาต์พุตส่วนใหญ่จะถูกต้อง แต่ทุกครั้งคุณจะได้รับตัวแบ่งบรรทัดเพิ่มเติม
RolandTumble

13

เคล็ดลับขั้นตอนการจัดเก็บคือคุณสามารถเรียกพวกเขาจากคำสั่ง INSERT ฉันพบสิ่งนี้มีประโยชน์มากเมื่อฉันทำงานกับฐานข้อมูล SQL Server

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto

1
เศร้าไม่สามารถใช้กับ @TableVariable
Kristen

ความเจ็บปวดด้วยเทคนิคที่มีประโยชน์มากนี้แตกต่างจาก #tables ส่วนใหญ่คุณต้องกำหนดคอลัมน์ทั้งหมดอย่างสมบูรณ์ วิธีขี้เกียจในการทำเช่นนี้คือการสร้าง #table ภายใน proc ที่คุณโทรหาตอนท้ายจากนั้น sp_help ใน tempdb คัดลอกและวางลบรหัสจาก proc เสร็จสิ้น
adolf กระเทียม

12

ใน SQL Server 2005/2008 เพื่อแสดงหมายเลขแถวในผลการสืบค้น SELECT:

SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
        GrandTotal, CustomerId, PurchaseDate
FROM Orders

ORDER BY เป็นประโยคภาคบังคับ ประโยค OVER () บอกให้ SQL Engine เรียงลำดับข้อมูลในคอลัมน์ที่ระบุ (ในกรณีนี้คือ OrderId) และกำหนดหมายเลขตามผลการเรียงลำดับ


จะไม่ง่ายกว่านี้หากใช้ syntactic suger ใน sql engine เพื่อแยกคำไวยากรณ์เป็น "RowNumberInTable"
ไม่มี

1
+1 สำหรับฟังก์ชั่นหน้าต่าง คุณสามารถทำสิ่งต่าง ๆ ได้มากกว่าชุดย่อยของระเบียนโดยใช้ OVER (PARTITION BY ... ) msdn.microsoft.com/en-us/library/ms189461%28v=SQL.100%29.aspx
Matt Stephenson

10

มีประโยชน์สำหรับการแยกวิเคราะห์อาร์กิวเมนต์ของโพรซีเดอร์ที่เก็บ: xp_sscanf

อ่านข้อมูลจากสตริงลงในตำแหน่งอาร์กิวเมนต์ที่ระบุโดยอาร์กิวเมนต์แต่ละรูปแบบ

ตัวอย่างต่อไปนี้ใช้ xp_sscanf เพื่อแยกค่าสองค่าจากสตริงต้นทางตามตำแหน่งในรูปแบบของสตริงต้นฉบับ

DECLARE @filename varchar (20), @message varchar (20)
EXEC xp_sscanf 'sync -b -fproducts10.tmp -rrandom', 'sync -b -f%s -r%s', 
  @filename OUTPUT, @message OUTPUT
SELECT @filename, @message

นี่คือชุดผลลัพธ์

-------------------- -------------------- 
products10.tmp        random

4
ฉันจะต้องมีช่วงเวลาที่โง่ (ไม่จริง) คุณบอกฉันได้ไหมว่าเราจะใช้สิ่งนี้ได้ที่ไหน
s มากขึ้น

9

วันเดินทางกลับเท่านั้น

Select Cast(Floor(Cast(Getdate() As Float))As Datetime)

หรือ

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))

เวอร์ชั่นสั้น - SELECT CAST (FLOOR (CAST (@DateTime AS FLOAT)) ตามเวลา)
Meff

ใช่. กฎ CASTFLOORCAST
StingyJack

ไม่พบการอ้างอิง แต่ดูเหมือนว่าฉันจะจำการทดสอบที่แนะนำ SELECT DateAdd (วัน, 0, DateDiff (วัน, 0, @DateTime)) ได้เร็วขึ้น มีความสุขที่ได้รู้แจ้งทั้งสองทาง!
Kristen

พบsqlteam.com/forums/topic.asp?TOPIC_ID=35296#107617นี้แต่ไม่ได้รวมวิธี CAST / FLOOR การทดสอบทางการในระเบียนขนาดกลางแสดงให้เห็น DATEADD อาจจะประมาณ 7% เร็วกว่านักแสดง / FLOOR - ไม่เพียงพอที่จะกังวลเกี่ยวกับสถานการณ์ส่วนใหญ่
คริสเต

ฉันได้เพิ่มวิธีอื่น ๆ ; การทดสอบอย่างรวดเร็วของฉันแสดงให้เห็นว่าวิธีการโยนแบบพื้นเป็น 800 นาโนวินาทีเร็วขึ้น ดังนั้นไม่มีอะไรในนั้นจริงๆ
GateKiller

9

dm_db_index_usage_stats

สิ่งนี้ช่วยให้คุณทราบว่าข้อมูลในตารางได้รับการอัปเดตเมื่อเร็ว ๆ นี้แม้ว่าคุณจะไม่มีคอลัมน์ DateUpdated บนตาราง

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'MyDatabase')
AND OBJECT_ID=OBJECT_ID('MyTable')

รหัสจาก: http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-up-ated-for-any-table/

ข้อมูลอ้างอิงจาก: SQL Server - วันที่ / เวลาของแถวที่แทรกล่าสุดของตารางคืออะไร

พร้อมใช้งานใน SQL 2005 และใหม่กว่า


7

นี่คือคุณสมบัติบางอย่างที่ฉันพบว่ามีประโยชน์ แต่ผู้คนจำนวนมากไม่รู้ว่า:

sp_tables

ส่งคืนรายการของวัตถุที่สามารถสอบถามได้ในสภาพแวดล้อมปัจจุบัน นี่หมายถึงวัตถุใด ๆ ที่สามารถปรากฏในส่วนคำสั่ง FROM ยกเว้นวัตถุที่มีความหมายเหมือนกัน

ลิงค์

sp_stored_procedures

ส่งคืนรายการของกระบวนงานที่เก็บไว้ในสภาพแวดล้อมปัจจุบัน

ลิงค์


7

ค้นหาระเบียนที่วันที่อยู่ที่ไหนสักแห่งในสัปดาห์ปัจจุบัน

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )

ค้นหาระเบียนที่วันที่เกิดขึ้นเมื่อสัปดาห์ที่แล้ว

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

ส่งคืนวันที่สำหรับการเริ่มต้นของสัปดาห์ปัจจุบัน

select dateadd( week, datediff( week, 0, getdate() ), 0 )

ส่งคืนวันที่สำหรับการเริ่มต้นของสัปดาห์ที่แล้ว

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

ใช้ได้ แต่ไม่ใช้ดัชนีบน TransDate ฉันอยากจะเขียน
vaso

โดยที่ TransDate> = convert (วันที่และเวลา, ชั้น (แปลง (float, dateadd (วัน, -datepart (วันทำงาน, @date) +1, @Date))) และ TransDate> = แปลง (วันที่, floor (แปลง, floatadd dateadd (วัน 7 ส่วนวันที่ (วันทำงาน, @ วันที่) +1, @ วันที่)))
vaso

การแก้ไข: โดยที่ TransDate> = convert (วันที่และเวลา, ชั้น (แปลง (float, dateadd (วัน, - ส่วนวัน (วันทำงาน, @ วันที่)) +1, @ วันที่))) และ TransDate <แปลง (วันที่, ชั้น (แปลง, dateadd (วัน 7 ส่วนวันที่ (วันทำงาน @ วันที่) +1, @ วันที่))))
vaso

7

มีคุณสมบัติที่ซ่อนไม่มากนัก แต่การตั้งค่าการแมปกุญแจใน Management Studio ภายใต้ Tools \ Options \ Keyboard: Alt + F1 ถูกกำหนดเป็น sp_help "ข้อความที่เลือก" แต่ฉันไม่สามารถใช้งานได้หากปราศจาก Ctrl + F1 สำหรับ sp_helptext "ข้อความที่เลือก"


ฉันใช้เพื่อกำหนดค่าคำสั่ง USE เช่นกันสำหรับการย้ายตาม db ของ
Jhonny D. Cano -Leftware-

7

คอลัมน์ยืนกรานคำนวณ-

  • คอลัมน์ที่คำนวณได้สามารถช่วยคุณเปลี่ยนต้นทุนการคำนวณรันไทม์เป็นระยะการปรับเปลี่ยนข้อมูล คอลัมน์ที่คำนวณจะถูกเก็บไว้กับส่วนที่เหลือของแถวและจะถูกใช้อย่างโปร่งใสเมื่อนิพจน์ในคอลัมน์ที่คำนวณและแบบสอบถามตรงกับ นอกจากนี้คุณยังสามารถสร้างดัชนีใน PCC เพื่อเพิ่มความเร็วในการกรองและพิสัยการสแกนบนนิพจน์

ลิงค์


7

มีหลายครั้งที่ไม่มีคอลัมน์ที่เหมาะสมในการจัดเรียงหรือคุณเพียงแค่ต้องการเรียงลำดับเริ่มต้นบนตารางและคุณต้องการระบุแต่ละแถว ในการทำเช่นนั้นคุณสามารถใส่ "(เลือก 1)" ในประโยค "เรียงตาม" และคุณจะได้สิ่งที่คุณต้องการ เรียบร้อยเหรอ

select row_number() over (order by (select 1)), * from dbo.Table as t

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