SQL Server'ın Gizli Özellikleri


215

SQL Server'ın bazı gizli özellikleri nelerdir ?

Örneğin, belgelenmemiş sistem saklı yordamlar, çok yararlı olan ancak yeterince belgelenmeyen şeyler yapmak için püf noktaları?


Yanıtlar

Tüm harika cevaplar için herkese teşekkürler!

Saklı Yordamlar

  • sp_msforeachtable: '?' ile bir komut çalıştırır her tablo adıyla değiştirilir (v6.5 ve üstü)
  • sp_msforeachdb: '?' ile bir komut çalıştırır her veritabanı adıyla değiştirilir (v7 ve üstü)
  • sp_who2: tıpkı sp_who gibi, ancak sorun giderme blokları (v7 ve üstü) için çok daha fazla bilgi
  • sp_helptext: Saklı yordamın kodunu istiyorsanız, & UDF'yi görüntüleyin
  • sp_tables: kapsamdaki tüm tabloların ve veritabanı görünümlerinin bir listesini döndürür.
  • sp_stored_procedures: saklanan tüm prosedürlerin bir listesini döndürür
  • xp_sscanf: Dizeden verileri her biçim bağımsız değişkeni tarafından belirtilen bağımsız değişken konumlarına okur.
  • xp_fixeddrives:: En büyük boş alana sahip sabit sürücüyü bulun
  • sp_help: Bir tablonun tablo yapısını, dizinlerini ve kısıtlamalarını bilmek istiyorsanız. Ayrıca görünümler ve UDF'ler. Kısayol Alt + F1

Parçacıklar

  • Satırları rastgele sırada döndürme
  • Son değişiklik tarihine göre tüm veritabanı Kullanıcı Nesneleri
  • Yalnızca Dönüş Tarihi
  • Tarihin içinde bulunulan hafta içinde olan kayıtları bulun.
  • Geçen hafta gerçekleşen kayıtları bulun.
  • Geçerli haftanın başlangıcı için tarihi döndürür.
  • Geçen haftanın başlangıcı için tarih döndürür.
  • Bir sunucuya dağıtılmış bir yordamın metnine bakın
  • Tüm bağlantıları veritabanına bırak
  • Tablo Sağlama Toplamı
  • Satır Sağlama Toplamı
  • Tüm yordamları bir veritabanına bırakın
  • Geri yükleme işleminden sonra oturum açma kimliklerini doğru şekilde yeniden eşleyin
  • Saklı Yordamlar bir INSERT deyiminden çağırın
  • Anahtar Kelime ile Prosedür Bul
  • Tüm yordamları bir veritabanına bırakın
  • Bir veritabanı için işlem günlüğünü programlı olarak sorgulayın.

Fonksiyonlar

  • HashBytes ()
  • EncryptByKey
  • PIVOT komutu

Çeşitli

  • Bağlantı Dizesi ekstraları
  • TableDiff.exe
  • Oturum Açma Olayları için Tetikleyiciler (Service Pack 2'deki Yenilikler)
  • Kalıcı hesaplanmış sütunlar (pcc) ile performansı artırma.
  • Sys.database_principles içindeki DEFAULT_SCHEMA ayarı
  • Zorla Parametrelendirme
  • Vardecimal Depolama Biçimi
  • En popüler sorguları saniyeler içinde bulma
  • Ölçeklenebilir Paylaşılan Veritabanları
  • SQL Management Studio'daki Tablo / Saklı Yordam Filtre özelliği
  • İzleme bayrakları
  • GOToplu işlemi tekrarladıktan sonraki sayı
  • Şemalar kullanarak güvenlik
  • Dahili şifreleme işlevlerini, görünümleri ve tetikleyicili taban tabloları kullanarak şifreleme

4
Biliniyorsa, her cevaba uygulanabilir sürümleri dahil etmek güzel olurdu. (2000 ve üstü, yalnızca 2005, 2000 vb.)
bw

Bu soruda çok fazla iyilik var. Lütfen silmeyin! :-)
Sklivvz

Yanıtlar:


91

Management Studio'da, toplu işin bu sayıda tekrarlanmasına neden olmak için GO toplu iş sonu işaretleyicisinden sonra bir sayı koyabilirsiniz:

PRINT 'X'
GO 10

'X'i 10 kez yazdıracaktır. Bu, tekrar eden şeyler yaparken sizi sıkıcı kopyalama / yapıştırma işlemlerinden kurtarabilir.


70

Birçok SQL Server geliştiricisi , DELETE, INSERT ve UPDATE deyimindeki OUTPUT yan tümcesini (SQL Server 2005 ve daha yeni) bilmiyor gibi görünüyor .

Hangi satırların INSERT, UPDATEd veya DELETEd olduğunu bilmek son derece yararlı olabilir ve OUTPUT yantümcesi bunu çok kolay bir şekilde yapmanızı sağlar - denilen insertedve deleted(tetikleyicilerde olduğu gibi) "sanal" tablolara erişim sağlar :

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

INT IDENTITY birincil anahtar alanı olan bir tabloya ÇIKIŞ yan tümcesiyle değerler ekliyorsanız, eklenen yeni kimliği hemen alabilirsiniz:

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

Ve güncelleme yapıyorsanız, neyin değiştiğini bilmek son derece yararlı olabilir - bu durumda, insertedyeni değerleri temsil eder (GÜNCELLEME sonrasında), ancak deletedGÜNCELLEME öncesi eski değerleri ifade eder:

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

Çok fazla bilgi döndürülürse, OUTPUT çıktısı geçici bir tabloya veya tablo değişkenine ( OUTPUT INTO @myInfoTable) yeniden yönlendirilebilir .

Son derece kullanışlı - ve çok az biliniyor!

üzüm posası


52

sp_msforeachtable: '?' İle komut çalıştırır her tablo adıyla değiştirilir. Örneğin

exec sp_msforeachtable "dbcc dbreindex('?')"

Her tablo için en fazla 3 komut verebilirsiniz

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

Ayrıca, sp_MSforeachdb


2
Soru işareti etrafında tek tırnak kullanarak sorgudaki tablonun adını alabilirsiniz. sp_msforeachtable "sayı seç (*), '?' tabenm olarak? "
Jody

51

Bağlantı Dizesi ekstraları:

MultipleActiveResultSets = Gerçek;

Bu, ADO.Net 2.0 ve üstünü tek bir veritabanı bağlantısında birden çok, salt ileri, salt okunur sonuç kümelerini okur, bu da çok fazla okuma yaparsanız performansı artırabilir. Sorgu türlerinin bir karışımını yapsanız bile açabilirsiniz.

Uygulama Adı = ProgramımAdı

Sysprocesses tablosunu sorgulayarak etkin bağlantıların bir listesini görmek istediğinizde, programınızın adı ".Net SqlClient Data Provider" yerine program_adı sütununda görünecektir


7
Uygulama Adı'nı şirketim için bir şart haline getirdim. Her yeni uygulamanın benzersiz bir adı olmalıdır. Hangi uygulamanın kilitlendiğini / bir şeyi çok daha kolay kırdığını izlemeyi kolaylaştırır.
Neil N

2
Uygulama Adı, profil oluşturucuda filtre olarak da kullanılabilir. İş arkadaşlarınızın sorgularını değil, yalnızca sorgularınızı görmek istiyorsanız çok yardımcı olur.
Mathias F

33

TableDiff.exe

  • Tablo Farkı aracı, bir kaynak ve hedef tablo veya görünüm arasındaki farkları keşfetmenize ve mutabık kılmanıza olanak tanır. Tablediff Yardımcı Programı, şema ve verilerdeki farklılıkları bildirebilir. Tablediff'in en popüler özelliği, hedefler üzerinde çalıştırabileceğiniz ve tablolar arasındaki farkları uzlaştıracak bir komut dosyası oluşturabilmesidir.

bağlantı


31

Satırları rastgele sırada döndürmek için daha az bilinen bir TSQL tekniği:

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

6
Küçük sonuç setleri için harika. Yedeklemek için zamanınız olmadıkça 10000'den fazla satır içeren bir masada kullanmazdım
John Sheehan

Bundan daha büyük masalarda kullandım ve çok yavaş değildi.
Mitch Wheat

CHECKSUM'un () amacı nedir? Sadece NEWID () ile sipariş verebilirsiniz.
Jonas Lincoln

6
Hatta CHECKSUM () olmadan 100.000.000 (100 mil) satırda iyi sonuçlar gördüm. Ayrıca, ben de sormalıyım, neden sadece SİPARİŞ VERMİYORUM?
Troy DeMonbreun

5
@GateKiller: Düzenlemenizi geri aldım, çünkü Checksum () bir hata değil; sıralama sütununun boyutunu azaltır.
Mitch Wheat

30

Management Studio'da bir tablo için virgülle ayrılmış sütunların listesini hızlı bir şekilde alabilirsiniz:

  1. Nesne Gezgini'nde, belirli bir tablonun altındaki düğümleri genişletin (böylece Sütunlar, Anahtarlar, Sınırlamalar, Tetikleyiciler vb. İçin klasörler görürsünüz)
  2. Sütunlar klasörünün üzerine gelin ve bir sorguya sürükleyin.

Bu, tabloya sağ tıklayıp Komut Dosyası Tablosu Farklı Yap ... 'ı seçip ardından Ekle ...' yi seçerek döndürülen parlak formatı kullanmak istemediğinizde kullanışlıdır. Bu hile, size vereceği diğer klasörlerle çalışır klasör içinde bulunan virgülle ayrılmış adların listesi.


23

Sıra Yapıcılar

Tek bir ekleme ifadesiyle birden çok veri satırı ekleyebilirsiniz.

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

Buna oy verdim, ancak MSSQL 2005'te denedim ve işe yaramıyor. Sadece 2008 mi?
richardtallent

11
Evet, 2008'in yeni bir özelliği.
Rob Boek

2
Bu, DB2'den SQL Server'a geldiğimde kaçırdığım bir özellikti. DB2'de, bunu bireysel uç ifadeleri yerine kullanırken önemli bir hız artışı oldu
Nathan Koop

22

Tablo yapısını, dizinleri ve kısıtlamaları bilmek istiyorsanız:

sp_help 'TableName'

Bu ipucunu kısayol tuşuyla birleştirin! Önce bir tablo adını vurgulayın ve sonra ALT + F1'e basın
Michael J Swart


20

En popüler sorguları bulma

  • Sys.dm_exec_query_stats ile, tek bir sorgu ile birçok sorgu analizi kombinasyonunu bulabilirsiniz.

Commnad ile bağlantı

select * from sys.dm_exec_query_stats 
order by execution_count desc


16

İSTİSNA VE KESMEN

Ayrıntılı birleştirmeler ve alt sorgular yazmak yerine, bu iki anahtar kelime, iki sorgu sonucunu karşılaştırırken sorgunuzun niyetini ifade etmenin çok daha zarif bir kısayol ve okunabilir yoludur. SQL Server 2005'ten itibaren yeni, yıllardır TSQL dilinde var olan UNION'u güçlü bir şekilde tamamlıyorlar.

EXCEPT, INTERSECT ve UNION kavramları, tüm modern RDBMS tarafından kullanılan ilişkisel modellemenin temeli ve temelini oluşturan küme teorisinde temeldir. Şimdi, Venn diyagram tipi sonuçları TSQL kullanılarak daha sezgisel ve oldukça kolay bir şekilde üretilebilir.


16

Tam olarak gizli olmadığını biliyorum, ama çok fazla insan PIVOT komutunu bilmiyor . İmleçleri kullanan ve satır sayısının onda biri olan hızlı bir 6 saniyelik kod parçasına girmek için 2 dakika süren saklı bir yordamı değiştirebildim!


16

Bir veritabanını Test amacıyla veya başka bir amaçla geri yüklerken yararlıdır. Giriş kimliğini doğru bir şekilde yeniden eşler:

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

Bu proc daha önce çalışmadı ve geçici bir kullanıcıya nesne sahipliğini değiştirmek, orijinal kullanıcıyı bırakmak, orijinali yeniden eklemek ve sahipliği geri atamak zorunda kaldım. Ugh ...
StingyJack

15

Veritabanına tüm bağlantıları bırakın:

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

Bunu benim için yapan bir astar veya bir bırak veritabanı parametresi var mı? UI aracılığıyla 'veritabanını silmeye çalışırsanız,' varolan bağlantıları kapat 'için bir boole parametresi olduğunu ima eden bir onay kutusu olduğunu fark ettim.
DevinB

1
Aslında, iki hatlı bir çözüm buldum. ALTER DATABASE [@ DATABASE_NAME @] ROLLBACK HEMEN İLE OKUYUNUZU AYARLA - bu tüm kullanıcıların bağlantılarını keser ALTER DATABASE [@ DATABASE_NAME @] READ_WRITE İLE GERİ DÖN DOLP VERİTABANI [@ DATABASE_NAME @]
DevinB

1
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATEyeni bağlantıların oluşmasını da önleyecektir.
ErikE

15

Tablo Sağlama Toplamı

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

Satır Sağlama Toplamı

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

2
Bunlar, tablodaki tüm veriler için bir sağlama toplamı oluşturmanıza olanak tanır. İki sıra veya iki tablonun aynı olup olmadığını kontrol etmenin basit ve hızlı bir yoludur.
GateKiller

15

Bunun gizli bir özellik olup olmadığından emin değilim, ama bunun üzerine tökezledim ve birçok durumda yararlı buldum. Bir alan kümesini, imleç kullanmak ve select deyimi arasında döngü yapmak yerine, tek bir select deyiminde konkatonlaştırabilirsiniz.

Misal:

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

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

SELECT @nvcConcatonated

Sonuçlar:

Acme, Microsoft, Apple,

2
değişkeni başlatmaya gerek kalmadan aynı şeyi yapmak için COALESCE () yöntemini de kullanabilirsiniz. SELECT @ nvcConcatonated = COALESCE (@nvcConcatonated + ',', '') + CAST (C.Şirket Adı VARCHAR (255) olarak) ...
Christopher Klein

Bu, bir güncelleme ifadesinde de çalışır. Bazen güncellenen kimliklerin listesini birleştirmek gibi şeyler yapmak için yararlıdır.
EBarr

14

Saklı yordamın kodunu istiyorsanız:

sp_helptext 'ProcedureName'

(gizli bir özellik olup olmadığından emin değilim, ancak her zaman kullanıyorum)


Nedenini bilmiyorum, ama sp_helptext çıktı orijinalindeki aşırı uzun satırlarda biraz aptal. Sprocs komut dosyaları oluşturulurken bu gerçekleşmez, belki başka, daha sağlam bir dışa aktarma mekanizması var mı? sp_helptext 'MyView' da yararlı.
Kristen

Ne anlatmak istediğinden emin değilim. Benim için, SPs kodu, orijinal dosyada (tüm CR'lerle, vb.) Onları aynı formatta çıktı
Eduardo Molteni

Kesin ayrıntıları hatırlamıyorum , ancak metnin saklanma şekliyle ilgili - sayfa boyutu hakkında bir şey olduğuna inanıyorum. Çıktı çoğunlukla doğrudur, ancak her şimdi ve sonra ekstra bir satır sonu elde edersiniz.
RolandTumble

13

Saklı yordam hilesi onları bir INSERT deyiminden çağırabilirsiniz. Bir SQL Server veritabanı üzerinde çalışırken bunu çok yararlı buldum.

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 ile ne yazık ki kullanılamaz
Kristen

Bu çok kullanışlı tekniğin acısı, # tabloların çoğunun aksine, tüm sütunları tam olarak tanımlamanız gerektiğidir. Bunu yapmanın tembel yolu, hemen aradığınız proc'un içindeki #table'ı oluşturmak, sonra tempdb'de sp_help, kopyalayıp yapıştırmak, proc'tan kodu kaldırmaktır. Bitti
adolf garlic

12

SQL Server 2005/2008'de SELECT sorgu sonucundaki satır numaralarını göstermek için:

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

ORDER BY zorunlu bir fıkradır. OVER () yan tümcesi SQL Engine'e belirtilen sütundaki verileri (bu durumda OrderId) sıralamasını ve sıralama sonuçlarına göre sayı atamasını söyler.


sql motorunda sözdizimi kelimesini "RowNumberInTable" olarak ayrıştırmak için sözdizimsel şeker kullansaydı daha kolay olmazdı
hiçbiri

1
Pencere fonksiyonları için +1. OVER (PARTITION BY ...) kullanarak bir kayıt alt kümesinin ÜZERİNDE şeyler yapabilirsiniz msdn.microsoft.com/en-us/library/ms189461%28v=SQL.100%29.aspx
Matt Stephenson

10

Saklı yordam bağımsız değişkenlerini ayrıştırmak için kullanışlıdır: kullanışlıdır xp_sscanf

Dizeden verileri her biçim bağımsız değişkeni tarafından belirtilen bağımsız değişken konumlarına okur.

Aşağıdaki örnek, kaynak dize biçimindeki konumlarına göre bir kaynak dizeden iki değer ayıklamak için xp_sscanf kullanır.

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

Sonuç kümesi.

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

4
Aptal bir an geçiriyor olmalıyım (hayır, gerçekten). Bunu nerede kullanabileceğimizi söyleyebilir misiniz?
Raj More

9

Yalnızca Dönüş Tarihi

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

veya

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

Kısa versiyon - SELECT CAST (ZEMİN (CAST (@DateTime AS FLAT) OLARAK))
Meff

Tabi lan. CASTFLOORCAST kuralları.
StingyJack

Bir başvuru bulunamıyor, ancak SELECT DateAdd (Gün, 0, DateDiff (Gün, 0, @TateTime)) önerilen testleri daha hızlı hatırlıyorum. Her iki şekilde de aydınlandığım için mutluyum!
Kristen

Bu sqlteam.com/forums/topic.asp?TOPIC_ID=35296#107617 bulundu ancak CAST / FLOOR yöntemini içermiyordu. Orta büyüklükte bir kayıt kümesinde resmi olmayan bir test, DATEADD'nin CAST / FLOOR'dan yaklaşık% 7 daha hızlı olabileceğini gösteriyor - çoğu durum için endişelenmek için yeterli değil
Kristen

Ancak diğer yöntemi ekledim; hızlı testim, dökme zemin yönteminin 800 Nanosaniye daha hızlı olduğunu gösteriyor. Yani içinde hiçbir şey gerçekten yok.
GateKiller

9

dm_db_index_usage_stats

Bu, tablodaki bir DateUpdated sütununuz olmasa bile, bir tablodaki verilerin yakın zamanda güncellenip güncellenmediğini bilmenizi sağlar.

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

Kod kaynağı: http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

Referans verilen bilgiler: SQL Server - Tablonun son eklenen satırının tarihi / saati nedir?

SQL 2005 ve sonraki sürümlerinde kullanılabilir


7

Yararlı bulduğum bazı özellikler şunlardır, ancak birçok insan bilmiyor gibi görünüyor:

sp_tables

Geçerli ortamda sorgulanabilecek nesnelerin listesini döndürür. Bu, eşanlamlı nesneler dışında bir FROM yan tümcesinde görünebilen herhangi bir nesne anlamına gelir.

bağlantı

sp_stored_procedures

Geçerli ortamda saklı yordamların bir listesini döndürür.

bağlantı


7

Tarihin içinde bulunulan hafta içinde olan kayıtları bulun.

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

Geçen hafta gerçekleşen kayıtları bulun.

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

Geçerli haftanın başlangıcı için tarihi döndürür.

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

Geçen haftanın başlangıcı için tarih döndürür.

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

İyi ancak TransDate'de dizin kullanılmaz.
Yazmayı

burada TransDate> = dönüştürme (datetime, kat (dönüştürme (float, dateadd (gün, -datepart (hafta içi, @date) +1, @date)))) ve TransDate> = convert (datetime, kat (dönüştürme (float, dateadd) (gün, 7-tarih bölümü (hafta içi, @tarih) +1, @tarih))))
vaso

düzeltme: burada TransDate> = dönüştürme (datetime, kat (convert (float, dateadd (gün, -datepart (hafta içi, @date) +1, @date)))) ve TransDate <convert (datetime, floor (convert (float, dateadd (gün, 7-datepart (içi, @date) + 1, @date))))
vazo

7

Çok gizli bir özellik değil, Araçlar \ Seçenekler \ Klavye altında Management Studio'da anahtar eşlemeleri ayarlamak: Alt + F1 varsayılan olarak sp_help "seçili metin" olarak ayarlanmıştır, ancak sp_helptext "seçili metin" için Ctrl + F1 eklenmeden yaşayamam


Ben de db's boyunca hareket için USE komutunu yapılandırmak için kullanıyorum
Jhonny D. Cano -Leftware-

7

Devam eden hesaplanmış-sütunları

  • Hesaplanan sütunlar, çalışma zamanı hesaplama maliyetini veri değiştirme aşamasına kaydırmanıza yardımcı olabilir. Hesaplanan sütun, satırın geri kalanıyla birlikte depolanır ve hesaplanan sütunlardaki ve sorgudaki ifade eşleştiğinde şeffaf olarak kullanılır. Ayrıca, filtreleri hızlandırmak ve ifadedeki taramaları aralıklandırmak için PCC'lerde dizinler oluşturabilirsiniz.

bağlantı


7

Sıralamak için uygun bir sütunun olmadığı zamanlar vardır veya yalnızca bir tabloda varsayılan sıralama düzenini ve her satırı numaralandırmak istiyorsunuz. Bunu yapmak için, "(1'i seçin)" siparişi "yan tümcesine koyabilirsiniz ve istediğinizi elde edersiniz. Düzgün, ha?

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.