Fitur Tersembunyi dari SQL Server


215

Apa sajakah fitur tersembunyi dari SQL Server ?

Sebagai contoh, sistem yang tidak terdokumentasi menyimpan prosedur, trik untuk melakukan hal-hal yang sangat berguna tetapi tidak cukup terdokumentasi?


Jawaban

Terima kasih untuk semua orang atas semua jawaban bagusnya!

Prosedur Tersimpan

  • sp_msforeachtable: Menjalankan perintah dengan '?' diganti dengan setiap nama tabel (v6.5 dan lebih tinggi)
  • sp_msforeachdb: Menjalankan perintah dengan '?' diganti dengan setiap nama basis data (v7 dan lebih tinggi)
  • sp_who2: sama seperti sp_who, tetapi dengan lebih banyak info untuk blok pemecahan masalah (v7 dan lebih tinggi)
  • sp_helptext: Jika Anda ingin kode prosedur tersimpan, lihat & UDF
  • sp_tables: mengembalikan daftar semua tabel dan tampilan basis data dalam lingkup.
  • sp_stored_procedures: mengembalikan daftar semua prosedur yang tersimpan
  • xp_sscanf: Membaca data dari string ke lokasi argumen yang ditentukan oleh setiap argumen format.
  • xp_fixeddrives:: Temukan drive tetap dengan ruang kosong terbesar
  • sp_help: Jika Anda ingin mengetahui struktur tabel, indeks dan batasan dari sebuah tabel. Juga dilihat dan UDF. Shortcut adalah Alt + F1

Cuplikan

  • Mengembalikan baris dalam urutan acak
  • Semua objek database Pengguna berdasarkan Tanggal Modifikasi Terakhir
  • Tanggal Pengembalian Saja
  • Temukan catatan tanggal yang jatuh di suatu tempat dalam minggu ini.
  • Temukan catatan tanggal mana yang terjadi minggu lalu.
  • Mengembalikan tanggal untuk awal minggu ini.
  • Mengembalikan tanggal untuk awal minggu lalu.
  • Lihat teks prosedur yang telah digunakan untuk server
  • Jatuhkan semua koneksi ke database
  • Checksum tabel
  • Checksum baris
  • Letakkan semua prosedur dalam database
  • Memetakan kembali Id login dengan benar setelah dipulihkan
  • Sebut Prosedur Tersimpan dari pernyataan INSERT
  • Temukan Prosedur Menurut Kata Kunci
  • Letakkan semua prosedur dalam database
  • Permintaan log transaksi untuk basis data secara terprogram.

Fungsi

  • HashBytes ()
  • EncryptByKey
  • Perintah PIVOT

Lain-lain

  • Ekstra Sambungan String
  • TableDiff.exe
  • Pemicu untuk Acara Logon (Baru di Paket Layanan 2)
  • Tingkatkan kinerja dengan kolom yang tetap-dikomputasi (pcc).
  • Pengaturan DEFAULT_SCHEMA di sys.database_principles
  • Parameterisasi Paksa
  • Format Penyimpanan Vardecimal
  • Mencari tahu kueri paling populer dalam hitungan detik
  • Basis Data Bersama yang Dapat diskalakan
  • Tabel / Stored Prosedur Prosedur fitur dalam SQL Management Studio
  • Lacak bendera
  • Nomor setelah GOpengulangan batch
  • Keamanan menggunakan skema
  • Enkripsi menggunakan fungsi enkripsi built-in, tampilan dan tabel dasar dengan pemicu

4
Jika diketahui, alangkah baiknya untuk memasukkan versi yang berlaku dengan setiap jawaban. (2000 dan lebih tinggi, 2005, 2000 saja, dll.)
bw

Ada banyak kebaikan dalam pertanyaan ini. Tolong jangan hapus itu! :-)
Sklivvz

Jawaban:


91

Di Studio Manajemen, Anda bisa meletakkan nomor setelah penanda akhir batch GO menyebabkan batch diulang beberapa kali:

PRINT 'X'
GO 10

Akan mencetak 'X' 10 kali. Ini dapat menyelamatkan Anda dari copy / paste yang membosankan saat melakukan hal-hal yang berulang.


70

Banyak pengembang SQL Server tampaknya masih tidak tahu tentang klausa OUTPUT (SQL Server 2005 dan yang lebih baru) pada pernyataan DELETE, INSERT, dan UPDATE.

Mungkin sangat berguna untuk mengetahui baris mana yang telah DIMASUK, UPDATEd, atau DELETEd, dan klausa OUTPUT memungkinkan untuk melakukan ini dengan sangat mudah - ini memungkinkan akses ke tabel "virtual" yang dipanggil inserteddan deleted(seperti dalam pemicu):

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

Jika Anda memasukkan nilai ke dalam tabel yang memiliki bidang kunci primer INT IDENTITY, dengan klausa OUTPUT, Anda bisa mendapatkan ID baru yang disisipkan segera:

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

Dan jika Anda memperbarui, akan sangat berguna untuk mengetahui apa yang berubah - dalam hal ini, insertedmewakili nilai-nilai baru (setelah UPDATE), sembari deletedmerujuk ke nilai-nilai lama sebelum UPDATE:

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

Jika banyak info akan dikembalikan, output OUTPUT juga dapat dialihkan ke tabel sementara atau variabel tabel ( OUTPUT INTO @myInfoTable).

Sangat bermanfaat - dan sangat sedikit yang diketahui!

Marc


52

sp_msforeachtable: Menjalankan perintah dengan '?' diganti dengan setiap nama tabel. misalnya

exec sp_msforeachtable "dbcc dbreindex('?')"

Anda dapat mengeluarkan hingga 3 perintah untuk setiap tabel

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

Juga, sp_MSforeachdb


2
Anda bisa mendapatkan nama tabel dalam kueri dengan menggunakan tanda kutip tunggal di sekitar tanda tanya. sp_msforeachtable "pilih hitungan (*), '?' sebagai tabenm dari? "
Jody

51

Ekstra Sambungan Koneksi:

MultipleActiveResultSets = true;

Ini membuat ADO.Net 2.0 dan di atasnya membaca banyak, hanya maju, hanya-baca hasil set pada koneksi database tunggal, yang dapat meningkatkan kinerja jika Anda melakukan banyak membaca. Anda dapat menyalakannya bahkan jika Anda sedang melakukan campuran jenis permintaan.

Nama Aplikasi = MyProgramName

Sekarang ketika Anda ingin melihat daftar koneksi aktif dengan menanyakan tabel sysprocesses, nama program Anda akan muncul di kolom program_name alih-alih ".Net SqlClient Data Provider"


7
Saya menjadikan Nama Aplikasi persyaratan di perusahaan saya. Setiap aplikasi baru harus memiliki nama yang unik. Membuat pelacakan aplikasi mana yang mengunci / memecahkan sesuatu lebih mudah.
Neil N

2
Nama Aplikasi juga tersedia sebagai filter dalam profiler. Ini sangat membantu jika Anda hanya ingin melihat pertanyaan Anda dan bukan pertanyaan rekan kerja Anda.
Mathias F

33

TableDiff.exe

  • Alat Perbedaan Tabel memungkinkan Anda menemukan dan merekonsiliasi perbedaan antara tabel sumber dan tujuan atau tampilan. Tablediff Utility dapat melaporkan perbedaan pada skema dan data. Fitur yang paling populer dari tablediff adalah fakta bahwa ia dapat menghasilkan skrip yang dapat Anda jalankan di tujuan yang akan merekonsiliasi perbedaan di antara tabel.

Tautan


31

Teknik TSQL yang kurang dikenal untuk mengembalikan baris dalam urutan acak:

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

6
Bagus untuk set hasil kecil. Saya tidak akan menggunakannya di atas meja dengan lebih dari 10.000 baris kecuali Anda punya waktu luang
John Sheehan

Saya sudah menggunakannya di meja yang jauh lebih besar dari itu, dan itu tidak terlalu lambat.
Mitch Wheat

Apa tujuan dari CHECKSUM ()? Anda dapat memesan hanya dengan NEWID ().
Jonas Lincoln

6
Saya bahkan telah melihat hasil yang layak pada baris 100.000.000 (100 mil), tanpa CHECKSUM (). Juga, saya harus bertanya juga, mengapa tidak hanya MEMESAN OLEH NEWID?
Troy DeMonbreun

5
@GateKiller: Saya telah memutar kembali hasil edit Anda, karena Checksum () bukan kesalahan; ini mengurangi ukuran kolom sortir.
Mitch Wheat

30

Di Studio Manajemen, Anda bisa dengan cepat mendapatkan daftar kolom yang dibatasi koma untuk tabel dengan:

  1. Di Object Explorer, perluas node di bawah tabel yang diberikan (sehingga Anda akan melihat folder untuk Kolom, Kunci, Kendala, Pemicu, dll.)
  2. Arahkan ke folder Kolom dan seret ke dalam kueri.

Ini berguna ketika Anda tidak ingin menggunakan format keji yang dikembalikan dengan mengklik kanan pada tabel dan memilih Skrip Tabel Sebagai ..., lalu Sisipkan Ke ... Trik ini berfungsi dengan folder lain yang akan memberi Anda daftar nama yang dibatasi koma yang ada di dalam folder.


23

Konstruktor Baris

Anda dapat menyisipkan banyak baris data dengan satu pernyataan penyisipan.

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

Saya memilih ini, tetapi kemudian mencobanya di MSSQL 2005, dan tidak berhasil. 2008 saja?
richardtallent

11
Ya, ini fitur baru 2008.
Rob Boek

2
Ini adalah fitur yang saya lewatkan ketika saya datang dari DB2 ke SQL Server. Di DB2, ada peningkatan kecepatan yang signifikan ketika menggunakan ini bukannya pernyataan memasukkan individu
Nathan Koop

22

Jika Anda ingin mengetahui struktur tabel, indeks dan batasan:

sp_help 'TableName'

Kombinasikan tip ini dengan tombol pintasnya! Pertama sorot nama tab dan tekan ALT + F1
Michael J Swart


20

Mencari tahu pertanyaan paling populer

  • Dengan sys.dm_exec_query_stats, Anda dapat mengetahui banyak kombinasi analisis kueri dengan satu kueri.

Tautkan dengan commnad

select * from sys.dm_exec_query_stats 
order by execution_count desc


16

KECUALI dan BERHUBUNGAN

Alih-alih menulis gabungan dan subquery yang rumit, kedua kata kunci ini adalah cara yang jauh lebih elegan dan mudah dibaca untuk mengekspresikan maksud kueri Anda saat membandingkan dua hasil kueri. Baru pada SQL Server 2005, mereka sangat melengkapi UNION yang telah ada dalam bahasa TSQL selama bertahun-tahun.

Konsep EXCEPT, INTERSECT, dan UNION adalah fundamental dalam teori himpunan yang berfungsi sebagai dasar dan dasar pemodelan relasional yang digunakan oleh semua RDBMS modern. Sekarang, hasil jenis diagram Venn dapat lebih intuitif dan cukup mudah dihasilkan menggunakan TSQL.


16

Saya tahu ini tidak sepenuhnya disembunyikan, tetapi tidak terlalu banyak orang yang tahu tentang perintah PIVOT . Saya dapat mengubah prosedur tersimpan yang menggunakan kursor dan membutuhkan waktu 2 menit untuk menjadi potongan kode 6 detik cepat yang sepersepuluh dari jumlah baris!


16

berguna saat mengembalikan database untuk tujuan Pengujian atau apa pun. Memetakan kembali ID login dengan benar:

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

Saya telah memiliki proc ini tidak berfungsi sebelumnya, dan saya harus mengubah kepemilikan objek menjadi pengguna temp, menjatuhkan pengguna asli, menambahkan kembali yang asli dan menetapkan kepemilikan kembali. Ugh ...
StingyJack

15

Jatuhkan semua koneksi ke database:

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

Apakah ada satu-liner, atau parameter database drop yang melakukan ini untuk saya? Saya perhatikan bahwa jika Anda mencoba untuk 'menghapus database' melalui ui, ada kotak centang untuk 'tutup koneksi yang ada' yang menyiratkan bahwa itu adalah parameter boolean.
DevinB

1
Sebenarnya, saya baru saja menemukan solusi dua jalur. ALTER DATABASE [@ DATABASE_NAME @] SET READ_ONLY DENGAN ROLLBACK SEGERA - ini memutus semua pengguna ALTER DATABASE [@ DATABASE_NAME @] SET READ_WRITE DENGAN ROLLBACK IMMEDIATE DROP DATABASE [@ DATABASE_NAME @]
devinB

1
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATEakan mencegah terjadinya koneksi baru juga.
ErikE

15

Checksum tabel

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

Checksum baris

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

2
Ini memungkinkan Anda untuk menghasilkan checksum untuk semua data dalam tabel. Ini adalah cara sederhana dan cepat untuk memeriksa apakah dua baris atau dua tabel sama.
GateKiller

15

Saya tidak yakin apakah ini fitur tersembunyi atau tidak, tetapi saya menemukan ini, dan menemukan ini berguna pada banyak kesempatan. Anda bisa menggabungkan satu set bidang dalam satu pernyataan pilih, daripada menggunakan kursor dan mengulang melalui pernyataan pilih.

Contoh:

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

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

SELECT @nvcConcatonated

Hasil:

Acme, Microsoft, Apple,

2
Anda juga dapat menggunakan COALESCE () untuk melakukan hal yang sama tanpa perlu menginisialisasi variabel. SELECT @nvcConcatonated = COALESCE (@nvcConcatonated + ',', '') + CAST (C.CompanyName as VARCHAR (255)) DARI ...
Christopher Klein

Ini juga berfungsi dalam pernyataan pembaruan. Terkadang berguna untuk melakukan hal-hal seperti menggabungkan daftar ID yang diperbarui.
EBarr

14

Jika Anda menginginkan kode prosedur tersimpan, Anda dapat:

sp_helptext 'ProcedureName'

(tidak yakin apakah itu fitur tersembunyi, tapi saya menggunakannya sepanjang waktu)


Tidak tahu mengapa, tetapi output sp_helptext agak konyol pada setiap baris yang terlalu panjang dalam aslinya. Ketika skrip Sprocs ini tidak terjadi, jadi mungkin ada mekanisme ekspor lain yang lebih kuat? sp_helptext 'MyView' juga berguna.
Kristen

Saya tidak yakin apa yang Anda maksud. Bagi saya, kode SP dihasilkan dengan format yang sama dengan yang saya tuliskan dalam file asli (dengan semua CR, dll)
Eduardo Molteni

Saya tidak ingat detail pastinya , tetapi itu ada hubungannya dengan cara teks disimpan - sesuatu tentang ukuran halaman, saya percaya. Outputnya sebagian besar benar, tetapi setiap sekarang & kemudian Anda mendapatkan jeda baris tambahan.
RolandTumble

13

Trik prosedur tersimpan adalah Anda dapat memanggil mereka dari pernyataan INSERT. Saya menemukan ini sangat berguna ketika saya sedang bekerja pada database 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
Sayangnya tidak dapat digunakan dengan @TableVariable
Kristen

Rasa sakit dengan teknik yang sangat berguna ini adalah bahwa tidak seperti kebanyakan # tabel lainnya, Anda harus sepenuhnya mendefinisikan semua kolom. Cara malas melakukan ini adalah dengan membuat tabel # di dalam proc yang Anda panggil di akhir, lalu sp_help di tempdb, salin dan tempel, hapus kode dari proc. Selesai
adolf bawang putih

12

Dalam SQL Server 2005/2008 untuk menampilkan nomor baris dalam hasil kueri SELECT:

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

ORDER BY adalah klausa wajib. Klausa OVER () memberi tahu Mesin SQL untuk mengurutkan data pada kolom yang ditentukan (dalam hal ini OrderId) dan menetapkan angka sesuai hasil pengurutan.


tidak akan lebih mudah jika mereka menggunakan suger sintaksis dalam mesin sql untuk menguraikannya kata sintaksis sebagai "RowNumberInTable"
none

1
+1 untuk fungsi jendela. Anda dapat melakukan hal-hal OVER bagian dari catatan dengan menggunakan OVER (PARTISI DENGAN ...) msdn.microsoft.com/en-us/library/ms189461%28v=SQL.100%29.aspx
Matt Stephenson

10

Berguna untuk parsing argumen prosedur tersimpan: xp_sscanf

Membaca data dari string ke lokasi argumen yang ditentukan oleh setiap argumen format.

Contoh berikut menggunakan xp_sscanf untuk mengekstraksi dua nilai dari string sumber berdasarkan posisi mereka dalam format string sumber.

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

Ini adalah hasil yang ditetapkan.

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

4
Saya pasti mengalami momen bodoh (tidak, sungguh). Bisakah Anda memberi tahu saya di mana kami dapat menggunakan ini?
Raj More

9

Tanggal Pengembalian Saja

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

atau

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

Versi singkat - SELECT CAST (FLOOR (CAST (@DateTime AS FLOAT)) SEBAGAI DATETIME)
Meff

Yeah. Aturan CASTFLOORCAST.
StingyJack

Tidak dapat menemukan referensi untuk itu, tapi sepertinya saya ingat tes yang menyarankan SELECT DateAdd (Hari, 0, DateDiff (Hari, 0, @ TanggalTime)) lebih cepat. Senang bisa tercerahkan, bagaimanapun juga!
Kristen

Ditemukan sqlteam.com/forums/topic.asp?TOPIC_ID=35296#107617 tetapi tidak menyertakan metode CAST / FLOOR. Tes informal pada rekaman berukuran sedang menunjukkan DATEADD mungkin sekitar 7% lebih cepat dari CAST / LANTAI - tidak cukup untuk khawatir tentang sebagian besar situasi
Kristen

Saya telah menambahkan metode lain, namun; pengujian cepat saya menunjukkan bahwa metode lantai cor 800 Nanoseconds lebih cepat. Jadi tidak ada apa-apa di dalamnya.
GateKiller

9

dm_db_index_usage_stats

Ini memungkinkan Anda untuk mengetahui apakah data dalam sebuah tabel telah diperbarui baru-baru ini walaupun Anda tidak memiliki kolom DateUpdated pada tabel.

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')

Kode dari: http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

Informasi yang dirujuk dari: SQL Server - Apa tanggal / waktu dari baris tabel yang dimasukkan terakhir?

Tersedia dalam SQL 2005 dan yang lebih baru


7

Berikut adalah beberapa fitur yang saya temukan berguna tetapi banyak orang tampaknya tidak tahu:

sp_tables

Mengembalikan daftar objek yang dapat ditanyakan di lingkungan saat ini. Ini berarti objek apa pun yang dapat muncul dalam klausa FROM, kecuali objek sinonim.

Tautan

sp_stored_procedures

Mengembalikan daftar prosedur tersimpan di lingkungan saat ini.

Tautan


7

Temukan catatan tanggal yang jatuh di suatu tempat dalam minggu ini.

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

Temukan catatan tanggal mana yang terjadi minggu lalu.

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

Mengembalikan tanggal untuk awal minggu ini.

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

Mengembalikan tanggal untuk awal minggu lalu.

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

Baik tetapi indeks pada TransDate tidak akan digunakan. Saya lebih suka menulis
vaso

di mana TransDate> = convert (datetime, floor (convert (float, dateadd (day, -datepart (weekday, @date) +1, @date)))) dan TransDate> = convert (datetime, floor (convert (float, dateadd (hari, 7-datepart (hari kerja, @tanggal) +1, @tanggal))))
vaso

koreksi: di mana TransDate> = convert (datetime, floor (convert (float, dateadd (day, -datepart (weekday, @date) +1, @date)))) dan TransDate <convert (datetime, floor (convert (float, dateadd (hari, 7-datepart (hari kerja, @tanggal) +1, @tanggal))))
vaso

7

Bukan fitur tersembunyi tetapi mengatur pemetaan kunci di Management Studio di bawah Tools \ Options \ Keyboard: Alt + F1 secara default menjadi sp_help "teks yang dipilih" tetapi saya tidak dapat hidup tanpa menambahkan Ctrl + F1 untuk sp_helptext "teks yang dipilih"


Saya gunakan untuk mengkonfigurasi perintah USE juga, untuk bergerak di sepanjang db's
Jhonny D. Cano -Leftware-

7

Kolom persisten-dihitung

  • Kolom yang dikomputasi dapat membantu Anda menggeser biaya komputasi runtime ke fase modifikasi data. Kolom yang dihitung disimpan dengan sisa baris dan digunakan secara transparan ketika ekspresi pada kolom yang dihitung dan kueri cocok. Anda juga dapat membuat indeks pada PCC untuk mempercepat penyaringan dan memindai berbagai ekspresi.

Tautan


7

Ada saat-saat ketika tidak ada kolom yang cocok untuk disortir, atau Anda hanya ingin urutan pengurutan default pada tabel dan Anda ingin menghitung setiap baris. Untuk melakukan itu, Anda dapat memasukkan "(pilih 1)" dalam klausa "urutan oleh" dan Anda akan mendapatkan yang Anda inginkan. Rapi, eh?

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.