SQL Server'ın bir sistem yordamına iletilen dize için bir nesne adı ile işlem yapmasına izin veren


13

Bir nesne adını sistem saklı yordamına geçirmenin yasal olmasına ne neden olur sp_helptext?

Hangi mekanizma nesne adını bir dizeye dönüştürür?

Örneğin

-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'

-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax

Ben değilim garip gelebilir gerekli bir olmadıkça, tek tırnak geçerli proc adlarına .ayırma şema adını ve prosedür adı. Ben parametre adı olarak geçirilecek bir dize hazır bilgi için bir alıntı adından otomatik dönüştürülür nasıl bir açıklama arıyorum.

Çözmek için özel bir sorunum yok; Belgelenmemiş şeyler hakkında meraklıyım.


Yorumlara yapılan katkılar bu sohbet odasına taşındı .
Paul White 9

Yanıtlar:


10

Sistem saklı yordamının ilk argümanı sp_helptext:

[@objname= ] 'name'
Kullanıcı tanımlı, şema kapsamındaki bir nesnenin nitelikli veya niteliksiz adıdır. Tırnak işaretleri yalnızca nitelikli bir nesne belirtilmişse gereklidir. Bir veritabanı adı da dahil olmak üzere tam bir ad verilirse, veritabanı adı geçerli veritabanının adı olmalıdır. Nesnenin geçerli veritabanında olması gerekir. adı, nvarchar(776)varsayılan yok.

Ayrıca, Sınırlandırılmış Tanımlayıcılar (Veritabanı Altyapısı) dokümantasyonu şunları belirtir:

SQL Server'da Tanımlayıcıları Parametreler Olarak Kullanma
Birçok sistem saklı yordamı, işlevi ve DBCC deyimi nesne adlarını parametre olarak alır. Bu parametrelerin bazıları çok parçalı nesne adlarını kabul ederken bazıları yalnızca tek parçalı adları kabul eder. Tek parçalı veya çok parçalı bir adın beklenip beklenmeyeceği, bir parametrenin SQL Server tarafından dahili olarak nasıl ayrıştırılacağını ve kullanılacağını belirler.

Tek parçalı Parametre Adları Parametre
tek parçalı bir tanımlayıcıysa, ad aşağıdaki şekillerde belirtilebilir:

  • Tırnak işaretleri veya sınırlayıcılar olmadan
  • Tek tırnak içine alınır
  • Çift tırnak içine alınır
  • Parantez içinde

Çok Parçalı Parametre Adları
Çok parçalı adlar, veritabanı veya şema adını ve ayrıca nesne adını içeren nitelikli adlardır. Çok parçalı bir ad parametre olarak kullanıldığında, SQL Server çok parçalı adı oluşturan tam dizenin tek tırnak işareti içine alınmasını gerektirir.


sp_helptextHem tek parça (kalifiye olmayan) hem de çok parçalı (nitelikli) nesne adlarını kabul eden ilk argüman .

Sonra T-SQL çözümleyici, yorumlanması et Eğer sp_helptextbir şekilde tek parça adı (dört madde noktalarının üzerinde uygun olarak) ve elde edilen adı prosedürle beklenen (string türü) bağımsız değişken değer olarak geçirilir.

Ayrıştırıcı bunu çok parçalı bir ad olarak gördüğünde , metnin belirtildiği gibi tek tırnak işareti içine alınması gerekir.

Çok parçalı bir adın temel özelliği bir .ayırıcıdır (tüm sınırlayıcıların dışında).

Sorudaki bu örnekler başarıyla tek bölümlü adlar olarak yorumlanmıştır:

myproc - tek parça (tırnak işaretleri veya sınırlayıcılar olmadan - madde işareti # 1)
[myproc] - tek parça (parantez içinde - madde işareti # 4)
'myproc' - tek parça (tek tırnak içinde - madde işareti # 2)
'dbo.myproc' - gerekli tek tırnak işaretleriyle çok parçalı
[dbo.myproc] - tek parça (parantez içinde - madde işareti # 4)

Sorunun son iki örneğinin her ikisi de çok parçalı parametre adları olarak ayrıştırılır (açıktaki .ayırıcıdan dolayı ). Bir hata üretirler çünkü gerekli tek tırnak işaretlerini içermezler:

dbo.myproc - gerekli tek tırnak işareti olmadan çok parçalı
[dbo]. [myproc] - gerekli tek tırnak işareti olmadan çok parçalı

Çift tırnak işareti kullanan bu ekstra örnek başarılı:

"dbo.myproc" - tek parça (çift tırnak içinde - madde işareti # 3)

Başarılı bir şekilde (yordam parametre değeri için) geçerli bir tek parça adı olarak yorumlandığını, ancak yordam kodunun aldığı (çok parçalı) dizeyi esnek bir şekilde ( PARSENAMEve kullanarak) yorumlayabildiğini unutmayın OBJECTID.

Son bir ilgi noktası olarak, burada çift tırnak işareti kullanmanın ayarına bağlı olmadığını unutmayın QUOTED_IDENTIFIER.

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.