Kamis, 31 Maret 2011

FUNCTION SQL

CREATE FUNGSI (Transact-SQL) SQL Server 2008 R2 Versi Lain

    
* SQL Server "Denali"
    
* SQL Server 2008
    
* SQL Server 2005
Membuat fungsi ditentukan oleh pengguna di SQL Server 2008 R2. Fungsi user-pasti adalah Transact-SQL atau biasa bahasa runtime (CLR) rutin yang menerima parameter, melakukan tindakan, seperti perhitungan yang kompleks, dan mengembalikan hasil tindakan sebagai nilai. Nilai kembali dapat menjadi nilai (tunggal) skalar atau meja. Gunakan pernyataan ini untuk membuat sebuah rutin yang reusable yang dapat digunakan dalam cara-cara:

    
*

      
Dalam pernyataan Transact-SQL seperti SELECT
    
*

      
Dalam aplikasi yang memanggil fungsi
    
*

      
Dalam definisi fungsi lain yang ditetapkan pengguna
    
*

      
Untuk parameterisasi melihat atau meningkatkan fungsionalitas dari sebuah indexed view
    
*

      
Untuk menentukan kolom dalam tabel
    
*

      
Untuk menentukan kendala PERIKSA pada kolom
    
*

      
Untuk mengganti prosedur yang tersimpan
Link ikon topik Transact-SQL Sintaks Konvensi Sintaksis Salinan
- Sintaks Transact-SQL Fungsi Skalar CREATE FUNCTION [schema_name. ] Function_name ([{Parameter_name @ [AS] [type_schema_name.] Parameter_data_type
    
[= Default] [readonly]}
    
[, ... N]
  
] ) PENGEMBALIAN return_data_type
    
[DENGAN [, ... n]]
    
[AS]
    
BEGIN
        
function_body
        
RETURN scalar_expression
    
AKHIR [;]

Salinan
- Transact-SQL Multistatement Tabel-nilai Fungsi Sintaks CREATE FUNCTION [schema_name. ] Function_name ([{Parameter_name @ [AS] [type_schema_name.] Parameter_data_type
    
[= Default] [readonly]}
    
[, ... N]
  
] ) RETURNS @ return_variable TABEL
    
[DENGAN [, ... n]]
    
[AS]
    
BEGIN
        
function_body
        
RETURN
    
AKHIR [;]

Salinan
- Transact-SQL Fungsi Klausul :: = {
    
[ENKRIPSI]
  
| [SCHEMABINDING]
  
| [RETURNS ON INPUT NULL NULL | DISEBUT ON INPUT NULL]
  
| [EXECUTE_AS_Clause] }
:: = ({
  
| }
    
[] [, ... N] ) :: = {
    
Data_type nama_kolom {}
    
[[DEFAULT constant_expression]
      
[Menyusun collation_name] | [ROWGUIDCOL]
    
]
    
| [IDENTITAS [(biji, kenaikan)]]
    
[ [... N]] }
:: = {
    
[NULL | NOT NULL]
    
{PRIMARY KEY | UNIQUE}
      
[Clustered | NONCLUSTERED]
      
[DENGAN FILLFACTOR = fillfactor
        
| DENGAN ( [, ... n])
      
[ON {filegroup | "default"}]
  
| [PERIKSA (logical_expression)] [, ... n] }
:: = nama_kolom AS computed_column_expression
:: = {
    
{PRIMARY KEY | UNIQUE}
      
[Clustered | NONCLUSTERED]
      
(Nama_kolom [ASC | DESC] [, ... n])
        
[DENGAN FILLFACTOR = fillfactor
        
| DENGAN ( [, ... n])
  
| [PERIKSA (logical_expression)] [, ... n] }
:: = {
    
PAD_INDEX = {ON | OFF}
  
| FILLFACTOR = fillfactor
  
| IGNORE_DUP_KEY = {ON | OFF}
  
| STATISTICS_NORECOMPUTE = {ON | OFF}
  
| ALLOW_ROW_LOCKS = {ON | OFF}
  
| ALLOW_PAGE_LOCKS = {ON | OFF} }
Salinan
- Sintaks CLR Fungsi Skalar CREATE FUNCTION [schema_name. ] Function_name ({Parameter_name @ [AS] [type_schema_name.] Parameter_data_type
    
[= Default]}
    
[, ... N] ) PENGEMBALIAN {return_data_type}
    
[DENGAN [, ... n]]
    
[AS] NAMA EKSTERNAL [;]
Salinan
- Tabel CLR-Valued Sintaks Fungsi CREATE FUNCTION [schema_name. ] Function_name ({Parameter_name @ [AS] [type_schema_name.] Parameter_data_type
    
[= Default]}
    
[, ... N] ) PENGEMBALIAN TABEL
    
[DENGAN [, ... n]]
    
[ORDER ()]
    
[AS] NAMA EKSTERNAL [;]
Salinan
- CLR Klausul Fungsi :: = {
   

   
[ASC | DESC] } [, ... N]
:: =
    
assembly_name.class_name.method_name
:: = }
    
[RETURNS ON INPUT NULL NULL | DISEBUT ON INPUT NULL]
  
| [EXECUTE_AS_Clause] }
:: = (Nama_kolom {data_type} [, ... n])

Argumen
schema_name

    
Apakah nama skema yang fungsi yang ditetapkan pengguna berada. function_name

    
Apakah nama fungsi yang ditetapkan pengguna. Nama Fungsi harus mematuhi aturan-aturan untuk pengenal dan harus unik di dalam database dan skema-nya.
    
Catatan Catatan

    
Kurung diperlukan setelah nama fungsi bahkan jika parameter tidak ditentukan. @ Parameter_name

    
Adalah parameter dalam fungsi yang ditetapkan pengguna. Satu atau lebih parameter dapat dideklarasikan.

    
Sebuah fungsi dapat memiliki maksimum 2.100 parameter. Nilai setiap parameter dinyatakan harus dipasok oleh pengguna saat fungsi ini dijalankan, kecuali default untuk parameter didefinisikan.

    
Tentukan nama parameter dengan menggunakan tanda (@) karakter sebagai yang pertama. Nama parameter harus sesuai dengan aturan untuk identifier. Parameter yang lokal untuk fungsi; nama parameter yang sama dapat digunakan pada fungsi lainnya. Parameter dapat mengambil satu-satunya tempat konstanta, mereka tidak dapat digunakan sebagai pengganti nama tabel, nama kolom, atau nama-nama objek database lain.
    
Catatan Catatan

    
ANSI_WARNINGS tidak dihormati ketika Anda melewatkan parameter dalam prosedur yang tersimpan, fungsi yang ditetapkan pengguna, atau ketika Anda menyatakan dan mengatur variabel dalam sebuah pernyataan batch. Misalnya, jika variabel didefinisikan sebagai char (3), dan kemudian set ke nilai yang lebih besar dari tiga karakter, data tersebut dipotong menjadi ukuran pasti dan INSERT atau pernyataan UPDATE berhasil. [Type_schema_name. ] Parameter_data_type

    
Apakah tipe data parameter, dan secara opsional skema mana ia berasal. Untuk fungsi Transact-SQL, tipe data semua, termasuk jenis CLR user-defined dan jenis tabel user-pasti, diperbolehkan kecuali tipe data timestamp. Untuk fungsi CLR, tipe data semua, termasuk jenis CLR pengguna pasti, diperbolehkan kecuali teks, ntext, gambar, jenis tabel user-defined dan data timestamp jenis. Jenis nonscalar, kursor dan meja, tidak dapat ditentukan sebagai jenis parameter data baik dalam Transact-SQL atau fungsi CLR.

    
Jika type_schema_name tidak ditentukan, Database Engine kelihatan untuk scalar_parameter_data_type dalam urutan sebagai berikut:

        
*

          
Skema yang berisi nama-nama sistem SQL Server tipe data.
        
*

          
Skema default pengguna saat ini dalam database saat ini.
        
*

          
The dbo skema dalam database saat ini.
[= Default]

    
Adalah nilai default parameter. Jika nilai default didefinisikan, fungsi bisa dijalankan tanpa menentukan nilai untuk parameter tersebut.
    
Catatan Catatan

    
Default nilai parameter bisa ditentukan untuk fungsi CLR kecuali untuk varchar (max) dan varbinary (max) tipe data.

    
Ketika parameter fungsi memiliki nilai default, kata kunci DEFAULT harus ditentukan saat fungsi ini dipanggil dalam rangka untuk mengambil nilai default. Perilaku ini berbeda dengan menggunakan parameter dengan nilai default dalam prosedur yang tersimpan di mana menghilangkan parameter juga menyiratkan nilai default. Pengecualian untuk perilaku ini adalah saat menjalankan fungsi skalar dengan menggunakan pernyataan EXECUTE. Bila menggunakan EXECUTE, kata kunci DEFAULT tidak diperlukan. Readonly

    
Menunjukkan bahwa parameter tidak dapat diperbarui atau diubah dalam definisi fungsi. Jika jenis parameter adalah jenis tabel user-defined, readonly harus ditentukan. return_data_type

    
Apakah nilai balik dari fungsi yang ditetapkan pengguna skalar. Untuk fungsi Transact-SQL, tipe data semua, termasuk jenis CLR pengguna pasti, diperbolehkan kecuali tipe data timestamp. Untuk fungsi CLR, tipe data semua, termasuk jenis CLR pengguna pasti, diperbolehkan kecuali teks, ntext, gambar, dan data timestamp jenis. Jenis nonscalar, kursor dan meja, tidak dapat ditetapkan sebagai tipe mengembalikan data baik dalam Transact-SQL atau fungsi CLR. function_body

    
Menentukan bahwa serangkaian pernyataan Transact-SQL, yang bersama-sama tidak menghasilkan efek samping seperti memodifikasi meja, menentukan nilai fungsi. function_body hanya digunakan dalam fungsi skalar dan meja multistatement-fungsi dihargai.

    
Dalam fungsi skalar, function_body adalah serangkaian pernyataan Transact-SQL yang bersama-sama mengevaluasi ke nilai skalar.

    
Dalam tabel bernilai multistatement fungsi, function_body adalah serangkaian pernyataan Transact-SQL yang mengisi sebuah variabel return TABEL. scalar_expression

    
Menentukan nilai skalar yang kembali fungsi skalar. TABEL

    
Menetapkan bahwa nilai kembali dari fungsi-tabel bernilai adalah sebuah tabel. Hanya konstanta dan @ local_variables dapat dikirimkan ke meja-fungsi dihargai.

    
Dalam tabel bernilai inline fungsi, nilai balik TABEL didefinisikan melalui pernyataan SELECT tunggal. fungsi Inline tidak memiliki variabel terkait kembali.

    
Dalam tabel bernilai multistatement fungsi, @ return_variable adalah variabel TABLE, digunakan untuk menyimpan dan menumpuk baris yang harus dikembalikan sebagai nilai fungsi. @ Return_variable bisa ditentukan hanya untuk fungsi Transact-SQL dan bukan untuk fungsi CLR. select_stmt

    
Apakah statemen SELECT tunggal yang mendefinisikan nilai kembali dari fungsi-meja inline dihargai. ORDER ()

    
Menentukan urutan hasil yang dikembalikan dari fungsi-meja dihargai. Untuk informasi lebih lanjut, lihat bagian itu, "Pedoman Menggunakan Order Urut," kemudian dalam topik ini. EKSTERNAL NAMA assembly_name.class_name.method_name

    
Menentukan metode majelis untuk mengikat dengan fungsi. assembly_name harus cocok majelis yang ada di SQL Server dalam database saat ini dengan visibilitas di. class_name harus SQL Server yang valid pengenal dan harus ada sebagai sebuah kelas di parlemen. Jika kelas memiliki nama namespace-kualifikasi yang menggunakan waktu untuk memisahkan bagian namespace (.), Nama kelas harus dibatasi dengan menggunakan kurung ([]) atau tanda kutip (""). method_name harus SQL Server yang valid pengenal dan harus ada sebagai metode statis di kelas tertentu.
    
Catatan Catatan

    
Secara default, SQL Server tidak bisa menjalankan kode CLR. Anda dapat membuat, memodifikasi, dan objek drop database yang referensi modul runtime umum bahasa, namun Anda tidak dapat menjalankan referensi tersebut di SQL Server sampai Anda mengaktifkan opsi CLR diaktifkan. Untuk mengaktifkan pilihan ini, gunakan sp_configure. ({ | } [] [, ... n])

    
Mendefinisikan tabel tipe data untuk fungsi Transact-SQL. Deklarasi mencakup definisi kolom tabel dan kolom atau kendala tabel. Tabel ini selalu diletakkan di filegroup primer. ({column_namedata_type} [, ... n])

    
Mendefinisikan data tabel jenis untuk fungsi CLR. Deklarasi tabel hanya mencakup nama kolom dan tipe data. Tabel ini selalu diletakkan di filegroup primer.
:: = dan :: =
Menetapkan bahwa fungsi akan memiliki satu atau lebih dari pilihan berikut.
ENKRIPSI

    
Menunjukkan bahwa Database Engine akan mengkonversi teks asli pernyataan CREATE FUNCTION ke format dikaburkan. Output dari kebingungan tidak langsung terlihat dalam pandangan katalog. Pengguna yang tidak memiliki akses ke tabel sistem atau file database tidak dapat mengambil teks dikaburkan. Namun, teks akan tersedia untuk user privilege yang baik dapat mengakses tabel sistem melalui port DAC atau langsung mengakses file database. Selain itu, pengguna yang dapat melampirkan debugger untuk proses server dapat mengambil prosedur asli dari memori pada saat runtime. Untuk informasi lebih lanjut tentang mengakses metadata sistem, lihat artikel Visibility Konfigurasi.

    
Dengan menggunakan opsi ini fungsi mencegah dari yang diterbitkan sebagai bagian dari replikasi SQL Server. Pilihan ini tidak dapat ditentukan untuk fungsi CLR. SCHEMABINDING

    
Menetapkan bahwa fungsi ini terikat pada objek database yang referensi. Ketika SCHEMABINDING yang ditentukan, obyek dasar tidak dapat dimodifikasi dengan cara yang akan mempengaruhi definisi fungsi. Definisi fungsi itu sendiri pertama harus diubah atau turun untuk menghapus dependensi pada objek yang akan dimodifikasi.

    
Pengikatan fungsi untuk referensi objek yang dihapus hanya ketika salah satu tindakan berikut terjadi:

        
*

          
Fungsi dijatuhkan.
        
*

          
Fungsi ini dimodifikasi dengan menggunakan pernyataan ALTER dengan opsi SCHEMABINDING tidak ditentukan.

    
Sebuah fungsi dapat skema terikat hanya jika kondisi berikut benar:

        
*

          
Fungsi ini adalah fungsi Transact-SQL.
        
*

          
Fungsi user-defined dan pandangan direferensikan oleh fungsi juga skema-terikat.
        
*

          
Objek direferensikan oleh fungsi direferensikan menggunakan nama dua-bagian.
        
*

          
Fungsi dan referensi objek yang berasal dari database yang sama.
        
*

          
Pengguna yang dieksekusi pernyataan CREATE FUNCTION memiliki izin REFERENSI pada obyek database yang referensi fungsi.
PENGEMBALIAN NULL NULL ON INPUT | DISEBUT ON INPUT NULL

    
Menentukan OnNULLCall atribut fungsi-skalar dihargai. Jika tidak ditentukan, DISEBUT ON NULL INPUT tersirat secara default. Ini berarti bahwa fungsi tubuh mengeksekusi bahkan jika NULL dilewatkan sebagai argumen.

    
Jika RETURNS ON NULL NULL INPUT ditentukan dalam fungsi CLR, ini menunjukkan bahwa SQL Server dapat kembali NULL ketika salah satu argumen yang diterimanya adalah NULL, tanpa benar-benar menyerukan tubuh fungsi. Jika metode fungsi CLR ditetapkan dalam sudah memiliki atribut khusus yang menunjukkan RETURNS ON NULL NULL INPUT, tetapi pernyataan CREATE FUNCTION menunjukkan DISEBUT ON NULL INPUT, pernyataan CREATE FUNCTION diutamakan. Atribut OnNULLCall tidak dapat ditentukan bagi fungsi meja CLR bernilai. EXECUTE AS Ayat

    
Menentukan konteks keamanan di mana fungsi yang ditetapkan pengguna dijalankan. Oleh karena itu, Anda dapat mengontrol account pengguna SQL Server menggunakan untuk memvalidasi hak akses pada setiap objek database yang direferensikan oleh fungsi.
    
Catatan Catatan

    
EXECUTE AS tidak dapat dispesifikasikan untuk fungsi yang ditetapkan pengguna inline.

    
Untuk informasi lebih lanjut, lihat EXECUTE Ayat AS (Transact-SQL).
:: =
Mendefinisikan tabel tipe data. Deklarasi mencakup definisi kolom tabel dan kendala. Untuk fungsi CLR, hanya nama_kolom dan data_type dapat ditentukan.
nama_kolom

    
Adalah nama kolom dalam tabel. Nama-nama kolom harus sesuai dengan aturan untuk identifier dan harus unik dalam tabel. nama_kolom bisa terdiri dari 1 hingga 128 karakter. data_type

    
Menentukan tipe data kolom. Untuk fungsi Transact-SQL, tipe data semua, termasuk jenis yang ditetapkan pengguna CLR, diperbolehkan kecuali timestamp. Untuk fungsi CLR, tipe data semua, termasuk jenis CLR pengguna pasti, diperbolehkan kecuali teks, ntext, gambar, char, varchar, varchar (max), dan jenis kursor timestamp.The nonscalar tidak dapat ditetapkan sebagai tipe kolom data baik Transact-SQL atau fungsi CLR. DEFAULT constant_expression

    
Menentukan nilai yang disediakan untuk kolom ketika nilai tidak secara eksplisit diberikan selama menyisipkan. constant_expression adalah sebuah konstanta, NULL, atau nilai fungsi sistem. definisi DEFAULT dapat diterapkan untuk setiap kolom kecuali orang-orang yang memiliki properti IDENTITAS. DEFAULT tidak dapat ditentukan bagi fungsi meja CLR bernilai. Menyusun collation_name

    
Menentukan collation untuk kolom. Jika tidak ditentukan, kolom diberikan pada penyusunan default dari database. Nama Collation dapat berupa kolasi Windows nama atau nama pemeriksaan SQL. Untuk daftar dan informasi lebih lanjut tentang collations, lihat Windows Collation Nama (Transact-SQL) dan SQL Server Nama Collation (Transact-SQL).

    
Menyusun klausul dapat digunakan untuk mengubah collations hanya kolom di nchar, char varchar,, dan tipe data nvarchar.

    
Collate tidak dapat ditentukan bagi fungsi meja CLR bernilai. ROWGUIDCOL

    
Menunjukkan bahwa kolom baru berturut-turut secara global unik kolom. Hanya satu uniqueidentifier kolom per tabel dapat ditunjuk sebagai kolom ROWGUIDCOL. Properti ROWGUIDCOL dapat diberikan hanya untuk uniqueidentifier kolom.

    
Properti ROWGUIDCOL tidak menegakkan keunikan nilai-nilai yang disimpan dalam kolom. Ini juga tidak secara otomatis menghasilkan nilai untuk baris baru dimasukkan ke dalam tabel. Untuk menghasilkan nilai unik untuk setiap kolom, gunakan fungsi NEWID terhadap laporan INSERT. Nilai baku dapat ditentukan, namun NEWID tidak dapat ditentukan sebagai standar. IDENTITAS

    
Menunjukkan bahwa kolom baru adalah sebuah kolom identitas. Ketika sebuah baris baru akan ditambahkan ke meja, SQL Server menyediakan nilai, unik tambahan untuk kolom. Identity kolom biasanya digunakan bersama dengan kendala PRIMARY KEY untuk melayani sebagai baris identifikasi unik untuk meja. Properti IDENTITAS dapat ditugaskan untuk tinyint, smallint, int, bigint, desimal (p, 0), atau numerik (p, 0) kolom. Hanya satu kolom identitas dapat dibuat per meja. default Bound dan hambatan DEFAULT tidak dapat digunakan dengan kolom identitas. Anda harus menentukan baik benih dan kenaikan atau tidak. Jika tidak ditentukan, defaultnya adalah (1,1).

    
IDENTITAS tidak dapat ditentukan bagi fungsi meja CLR bernilai.

    
biji

        
Apakah nilai integer yang akan ditugaskan ke baris pertama dalam tabel.
    
kenaikan

        
Apakah nilai integer untuk menambah nilai benih untuk baris berturut-turut dalam tabel.
:: = dan :: =
Mendefinisikan kendala untuk kolom tertentu atau meja. Untuk fungsi CLR, jenis kendala hanya diperbolehkan adalah NULL. kendala Named tidak diperbolehkan.
NULL | NOT NULL

    
Menentukan apakah nilai null diperbolehkan dalam kolom. NULL tidak sepenuhnya kendala tetapi bisa ditentukan seperti NULL TIDAK. TIDAK NULL tidak dapat ditentukan bagi fungsi meja CLR bernilai. PRIMARY KEY

    
Merupakan kendala yang memaksa integritas entitas untuk kolom yang ditetapkan melalui indeks yang unik. Dalam tabel-nilai fungsi-fungsi yang pasti, PRIMARY KEY constraint dapat dibuat pada satu kolom per meja. PRIMARY KEY tidak dapat ditentukan bagi fungsi meja CLR bernilai. UNIK

    
Merupakan kendala yang menyediakan integritas entitas untuk kolom tertentu atau kolom melalui indeks yang unik. Sebuah tabel dapat memiliki beberapa kendala UNIK. UNIK tidak dapat ditentukan bagi fungsi meja CLR bernilai. Cluster | NONCLUSTERED

    
Menunjukkan bahwa mengelompok atau indeks nonclustered diciptakan untuk PRIMARY KEY atau kendala UNIK. PRIMARY KEY kendala menggunakan cluster, dan kendala UNIK menggunakan NONCLUSTERED.

    
Clustered bisa ditentukan hanya untuk satu kendala. Jika Clustered dikhususkan untuk kendala UNIK dan PRIMARY KEY kendala juga ditentukan, PRIMARY KEY menggunakan NONCLUSTERED.

    
NONCLUSTERED bergerombol dan tidak dapat ditentukan bagi fungsi meja CLR bernilai. PERIKSA

    
Merupakan kendala yang memaksa integritas domain dengan membatasi nilai yang mungkin yang dapat dimasukkan ke dalam kolom atau kolom. PERIKSA kendala tidak dapat ditentukan bagi fungsi meja CLR bernilai.

    
logical_expression

        
Adalah ekspresi logis yang mengembalikan TRUE atau FALSE.
:: =
Menentukan kolom dihitung. Untuk informasi lebih lanjut tentang kolom dihitung, lihat CREATE TABLE (Transact-SQL).
nama_kolom

    
Adalah nama dari kolom dihitung. computed_column_expression

    
Merupakan ungkapan yang mendefinisikan nilai dari kolom dihitung.
:: =
Menentukan pilihan indeks untuk PRIMARY KEY atau indeks UNIK. Untuk informasi lebih lanjut tentang opsi indeks, lihat CREATE INDEX (Transact-SQL).
PAD_INDEX = {ON | OFF}

    
Menentukan indeks padding. default adalah OFF. FILLFACTOR = fillfactor

    
Menentukan persentase yang menunjukkan bagaimana penuh Engine Database harus membuat tingkat daun setiap halaman indeks saat pembuatan indeks atau perubahan. fillfactor harus berupa nilai integer dari 1 hingga 100. Defaultnya adalah 0. IGNORE_DUP_KEY = {ON | OFF}

    
Menentukan respon kesalahan saat mencoba memasukkan operasi untuk memasukkan nilai-nilai duplikat kunci ke dalam sebuah indeks yang unik. Pilihan IGNORE_DUP_KEY hanya berlaku untuk operasi memasukkan setelah indeks dibuat atau dibangun kembali. default adalah OFF. STATISTICS_NORECOMPUTE = {ON | OFF}

    
Menentukan apakah statistik distribusi menghitung ulang. default adalah OFF. ALLOW_ROW_LOCKS = {ON | OFF}

    
Menentukan apakah baris kunci diperbolehkan. default adalah ON. ALLOW_PAGE_LOCKS = {ON | OFF}

    
Menentukan apakah kunci halaman diperbolehkan. default adalah ON.
Praktik Terbaik
Jika suatu fungsi yang ditetapkan pengguna tidak diciptakan dengan klausa SCHEMABINDING, perubahan yang dibuat untuk objek yang mendasari dapat mempengaruhi definisi fungsi dan menghasilkan hasil yang tidak diharapkan bila dipanggil. Kami sarankan Anda menerapkan salah satu metode berikut untuk memastikan bahwa fungsi tersebut tidak menjadi usang karena perubahan pada objek yang mendasarinya:

    
*

      
Tentukan DENGAN klausa SCHEMABINDING saat Anda membuat fungsi. Hal ini memastikan bahwa obyek yang dirujuk dalam definisi fungsi tidak dapat diubah kecuali jika fungsi ini juga diubah.
    
*

      
Jalankan prosedur yang tersimpan sp_refreshsqlmodule setelah memodifikasi setiap obyek yang ditentukan dalam definisi fungsi.
Jenis Data
Jika parameter yang ditentukan dalam fungsi CLR, mereka harus jenis SQL Server seperti yang didefinisikan sebelumnya untuk scalar_parameter_data_type. Untuk informasi tentang sistem membandingkan data SQL Server jenis untuk tipe CLR integrasi data atau NET Framework. Umum data runtime bahasa jenis, lihat Pemetaan CLR Parameter Data.
Untuk SQL Server untuk referensi metode yang benar ketika kelebihan beban dalam kelas, metode yang tercantum dalam harus memiliki karakteristik sebagai berikut:

    
*

      
Menerima nomor yang sama parameter sebagaimana dimaksud dalam [, ... n].
    
*

      
Menerima semua parameter dengan nilai, bukan dengan referensi.
    
*

      
Gunakan jenis parameter yang kompatibel dengan yang ditetapkan dalam fungsi SQL Server.
Jika kembali tipe data dari fungsi CLR menentukan jenis tabel (RETURNS TABEL), data yang dikembalikan jenis metode dalam harus tipe IEnumerator atau IEnumerable, dan diasumsikan bahwa antarmuka dilaksanakan oleh pencipta fungsi. Tidak seperti fungsi Transact-SQL, fungsi CLR tidak dapat mencakup PRIMARY KEY, UNIQUE, atau kendala PERIKSA di . tipe data kolom yang ditentukan dalam harus cocok dengan jenis kolom yang sesuai hasil yang ditetapkan dikembalikan oleh metode dalam pada saat eksekusi. Jenis-pemeriksaan tidak dilakukan pada waktu fungsi dibuat.
Untuk informasi lebih lanjut tentang bagaimana fungsi CLR program, lihat Fungsi CLR User-Defined. Keterangan Umum
Bernilai skalar fungsi dapat dipanggil di mana ekspresi skalar digunakan. Ini termasuk kolom dihitung dan definisi PERIKSA kendala. Skalar-fungsi bernilai juga dapat dilakukan dengan menggunakan pernyataan EXECUTE. Bernilai skalar fungsi harus dipanggil dengan menggunakan setidaknya nama dua-bagian dari fungsi. Untuk informasi lebih lanjut tentang nama multi, lihat Transact-SQL Sintaks Konvensi (Transact-SQL). Tabel-nilai fungsi dapat dipanggil di mana ekspresi tabel diperbolehkan dalam klausa FROM dari SELECT, INSERT, UPDATE, atau pernyataan DELETE. Untuk informasi lebih lanjut, lihat Pelaksana Fungsi User-Defined (Database Engine). Interoperabilitas
Pernyataan berikut berlaku dalam suatu fungsi:

    
*

      
Laporan Penugasan.
    
*

      
pernyataan Control-of-Arus kecuali TRY ... CATCH laporan.
    
*

      
MENYATAKAN laporan mendefinisikan variabel lokal data dan kursor lokal.
    
*

      
PILIH laporan yang berisi daftar pilih dengan ekspresi yang memberikan nilai pada variabel lokal.
    
*

      
Cursor kursor referensi operasi lokal yang dinyatakan, dibuka, ditutup, dan deallocated dalam fungsi. Hanya FETCH pernyataan yang memberikan nilai pada variabel lokal menggunakan klausa INTO diijinkan; FETCH laporan yang kembali data ke klien tidak diperbolehkan.
    
*

      
INSERT, UPDATE, dan pernyataan DELETE memodifikasi variabel tabel lokal.
    
*

      
Laporan EXECUTE memanggil diperpanjang prosedur yang tersimpan.
    
*

      
Untuk informasi lebih lanjut, lihat Membuat Fungsi User-Defined (Database Engine).
Dihitung Kolom Interoperabilitas
Dalam SQL Server 2005 dan kemudian, fungsi memiliki properti berikut. Nilai sifat ini menentukan apakah fungsi dapat digunakan dalam kolom dihitung yang dapat berlangsung atau diindeks.
Properti

Deskripsi

Catatan
IsDeterministic

Fungsi deterministik atau nondeterministic.

Lokal akses data yang diperbolehkan dalam fungsi deterministik. Misalnya, fungsi yang selalu mengembalikan hasil yang sama setiap saat mereka disebut dengan menggunakan satu set tertentu dari nilai input dan dengan keadaan yang sama dari database akan diberi label deterministik.
IsPrecise

Fungsi ini tepat atau tidak tepat.

fungsi tidak tepat berisi operasi seperti operasi floating point.
IsSystemVerified

Sifat presisi dan determinisme dari fungsi dapat diverifikasi oleh SQL Server.


 
SystemDataAccess

Fungsi sistem data mengakses (sistem katalog atau tabel sistem virtual) dalam contoh lokal SQL Server.


 
UserDataAccess

Fungsi pengguna mengakses data dalam contoh lokal SQL Server.

Termasuk tabel user-defined dan tabel temp, tapi tidak variabel tabel.
Sifat presisi dan determinisme fungsi Transact-SQL ditentukan secara otomatis oleh SQL Server. Untuk informasi lebih lanjut, lihat User-Defined Fungsi Pedoman Desain. Akses data dan sifat determinisme fungsi CLR dapat ditentukan oleh pengguna. Untuk informasi lebih lanjut, lihat Overview CLR Custom Integrasi Atribut.
Untuk menampilkan nilai saat ini properti ini, gunakan OBJECTPROPERTYEX.
Sebuah kolom dihitung yang memanggil fungsi yang ditetapkan pengguna dapat digunakan dalam indeks jika fungsi yang ditetapkan pengguna memiliki nilai properti sebagai berikut:

    
*

      
IsDeterministic = true
    
*

      
IsSystemVerified = true (kecuali kolom dihitung adalah tetap bertahan)
    
*

      
UserDataAccess = false
    
*

      
SystemDataAccess = false
Untuk informasi lebih lanjut, lihat Membuat indeks pada Computed Kolom. Memanggil Extended Stored Procedures dari Fungsi
Prosedur tersimpan diperpanjang, ketika dipanggil dari dalam fungsi, tidak dapat kembali set hasil ke klien. Setiap API BPO yang menghasilkan set kembali ke klien akan kembali GAGAL. Prosedur tersimpan diperpanjang bisa terhubung kembali ke sebuah contoh dari SQL Server, namun tidak harus mencoba untuk bergabung dengan transaksi yang sama sebagai fungsi yang memanggil prosedur tersimpan diperpanjang.
Mirip dengan pemanggilan dari batch atau prosedur yang tersimpan, prosedur yang tersimpan diperpanjang akan dijalankan dalam konteks keamanan akun Windows dimana SQL Server yang berjalan. Pemilik prosedur yang tersimpan harus mempertimbangkan hal ini ketika memberikan izin EXECUTE di atasnya untuk pengguna. Keterbatasan dan Pembatasan
User-defined fungsi tidak dapat digunakan untuk melakukan tindakan yang mengubah negara database.
fungsi User-defined tidak dapat berisi klausul OUTPUT KE yang memiliki tabel sebagai target.
Layanan Broker berikut laporan tidak dapat dimasukkan dalam definisi fungsi Transact-SQL user-defined:

    
*

      
BEGIN DIALOG PERCAKAPAN
    
*

      
PERCAKAPAN AKHIR
    
*

      
GET GROUP PERCAKAPAN
    
*

      
PINDAHKAN PERCAKAPAN
    
*

      
MENERIMA
    
*

      
KIRIM
fungsi User-defined dapat diulang, yaitu, satu fungsi yang ditetapkan pengguna dapat panggilan lain. Tingkat nesting bertambah ketika fungsi dipanggil mulai pelaksanaan, dan decremented ketika fungsi eksekusi selesai menelepon. fungsi User-defined dapat diulang sampai 32 level. Melebihi tingkat maksimum menyebabkan bersarang rantai seluruh fungsi panggilan gagal. Setiap referensi untuk kode dikelola dari fungsi Transact-SQL user-defined dianggap sebagai satu tingkat terhadap batas bersarang 32-tingkat. Metode dipanggil dari dalam kode dikelola tidak dihitung terhadap batas ini. Menggunakan Sortir Order di CLR-Fungsi Tabel dihargai
Bila menggunakan klausa ORDER dalam fungsi tabel CLR bernilai, ikuti panduan:

    
*

      
Anda harus memastikan bahwa hasilnya selalu memerintahkan dalam urutan tertentu. Jika hasilnya tidak dalam urutan tertentu, SQL Server akan menghasilkan pesan kesalahan ketika query dijalankan.
    
*

      
Jika klausa ORDER ditentukan, output dari fungsi-tabel bernilai harus diurutkan sesuai dengan kolasi dari kolom (eksplisit atau implisit). Misalnya, jika pada penyusunan kolom adalah Cina (baik yang ditentukan dalam DDL untuk tabel-nilai fungsi atau diperoleh dari database collation), hasil yang dikembalikan harus diurutkan menurut aturan pengurutan Cina.
    
*

      
Klausa ORDER, bila ditetapkan, selalu diverifikasi oleh SQL Server ketika kembali hasil, baik atau tidak digunakan oleh prosesor query untuk melakukan optimasi lebih lanjut. Hanya menggunakan klausa ORDER jika Anda tahu itu berguna untuk prosesor query.
    
*

      
SQL Server query processor mengambil keuntungan dari klausa ORDER secara otomatis dalam kasus-kasus berikut:
          
o

            
Masukkan query dimana klausa ORDER kompatibel dengan indeks.
          
o

            
ORDER BY klausa yang kompatibel dengan klausa ORDER.
          
o

            
Agregat, dimana GROUP BY kompatibel dengan klausa ORDER.
          
o

            
agregat DISTINCT dimana kolom yang berbeda yang kompatibel dengan klausa ORDER.
Klausa ORDER tidak menjamin hasil memerintahkan ketika query SELECT dieksekusi, kecuali ORDER BY juga ditentukan dalam query. Lihat sys.function_order_columns (Transact-SQL) untuk informasi tentang bagaimana untuk melakukan query kolom termasuk dalam urutan-sort untuk tabel-fungsi dihargai. Metadata
Tabel berikut berisi pandangan sistem katalog yang dapat Anda gunakan untuk kembali metadata tentang fungsi yang ditetapkan pengguna.
Sistem Lihat

Deskripsi
sys.sql_modules

Menampilkan definisi fungsi Transact-SQL user-defined. Sebagai contoh: Salinan
USE AdventureWorks2008R2; GO SELECT definisi, tipe DARI sys.sql_modules SEBAGAI m JOIN SEBAGAI sys.objects o ON m.object_id = o.object_id
    
DAN tipe IN ('FN', 'IF', 'TF'); GO


Definisi fungsi yang dibuat dengan menggunakan opsi ENKRIPSI tidak dapat dilihat dengan menggunakan sys.sql_modules, namun, informasi lain tentang fungsi terenkripsi ditampilkan.
sys.assembly_modules

Menampilkan informasi tentang fungsi-fungsi yang didefinisikan CLR.
sys.parameters

Menampilkan informasi tentang parameter yang didefinisikan dalam fungsi yang ditetapkan pengguna.
sys.sql_expression_dependencies

Menampilkan objek yang mendasari direferensikan oleh fungsi. Permissions
Membutuhkan CREATE FUNGSI izin dalam izin database dan ALTER pada skema di mana fungsi ini diciptakan. Jika fungsi menetapkan jenis yang ditetapkan pengguna, membutuhkan izin EXECUTE pada jenis. Contoh A. Menggunakan fungsi yang ditetapkan pengguna skalar-nilai yang menghitung ISO minggu
Contoh berikut menciptakan ISOweek fungsi yang ditetapkan pengguna. Fungsi ini membutuhkan argumen tanggal dan menghitung jumlah minggu ISO. Untuk fungsi ini untuk menghitung dengan benar, SET DATEFIRST 1 harus dipanggil sebelum fungsi ini dipanggil.
Contoh ini juga menunjukkan menggunakan klausa EXECUTE AS untuk menentukan konteks keamanan di mana prosedur yang tersimpan dapat dilaksanakan. Pada contoh, para penelepon pilihan menentukan bahwa prosedur ini akan dijalankan dalam konteks pengguna yang menyebutnya. Pilihan lain yang dapat menentukan adalah DIRI, PEMILIK, dan user_name.
Berikut adalah fungsi panggil. Perhatikan bahwa DATEFIRST diatur ke 1. Salinan
USE AdventureWorks2008R2; GO JIKA object_id (N'dbo ISOweek ', N'FN'.) TIDAK NULL
    
DROP FUNGSI dbo.ISOweek; GO CREATE FUNGSI dbo.ISOweek (@ datetime TANGGAL) RETURNS int DENGAN MELAKSANAKAN SEBAGAI pemanggil AS BEGIN
     
MENYATAKAN @ ISOweek int;
     
SET @ ISOweek = DATEPART (wk, @ DATE) +1
          
-DATEPART (minggu, CAST (DATEPART (yy, @ DATE) sebagai CHAR (4)) + '0104 '); - Kasus Khusus: 01-03 Januari mungkin milik tahun sebelumnya
     
IF (@ ISOweek = 0)
          
SET @ ISOweek = dbo.ISOweek (CAST (DATEPART (yy, @ DATE) -1
               
AS CHAR (4)) CAST + '12 '+ (24 + DATEPART (DAY, @ DATE) AS CHAR (2))) +1; - Kasus Khusus: 29-31 Desember mungkin milik tahun berikutnya
     
IF ((DATEPART (mm, @ DATE) = 12) DAN
          
((DATEPART (dd, @ DATE)-DATEPART (dw, @ DATE))> = 28))
          
SET @ ISOweek = 1;
     
RETURN (@ ISOweek); END; GO SET DATEFIRST 1; PILIH dbo.ISOweek (CONVERT (DATETIME, '12 / 26/2004 ', 101)) AS' ISO Week ';


Berikut adalah hasil ditetapkan.
Minggu ISO
----------------
52 B. Membuat tabel fungsi-inline bernilai
Contoh berikut mengembalikan sebuah tabel fungsi-inline dihargai. Ia mengembalikan tiga kolom ProductID, Nama dan agregat total tahun-to-date dengan toko sebagai YTD Jumlah untuk setiap produk yang dijual ke toko. Salinan
USE AdventureWorks2008R2; GO JIKA object_id (N'Sales. Ufn_SalesByStore ', N'IF') IS NOT NULL
    
DROP FUNGSI Sales.ufn_SalesByStore; GO CREATE FUNGSI Sales.ufn_SalesByStore (@ int storeid) PENGEMBALIAN TABEL AS RETURN (
    
P. SELECT ProductID, P. Nama, SUM (SD.LineTotal) AS 'Total'
    
DARI Production.Product SEBAGAI P
    
JOIN SEBAGAI Sales.SalesOrderDetail SD ON SD.ProductID = P. ProductID
    
JOIN SEBAGAI Sales.SalesOrderHeader SH ON SH.SalesOrderID = SD.SalesOrderID
    
JOIN SEBAGAI Sales.Customer C ON SH.CustomerID = C. Pelanggan
    
WHERE C. StoreID = @ storeid
    
GROUP BY P. ProductID, P. Nama ); GO


Untuk memanggil fungsi, jalankan query ini. Salinan
SELECT * FROM Sales.ufn_SalesByStore (602);


C. Membuat pernyataan-meja-nilai multi fungsi
Contoh berikut menciptakan fn_FindReports fungsi tabel bernilai (InEmpID). Ketika disertakan dengan ID karyawan yang valid, fungsi mengembalikan sebuah tabel yang sesuai dengan semua karyawan yang melaporkan kepada karyawan baik secara langsung maupun tidak langsung. Fungsi tabel menggunakan ekspresi rekursif umum (CTE) untuk menghasilkan daftar hirarkis karyawan. Untuk informasi lebih lanjut tentang CTEs rekursif, lihat DENGAN common_table_expression (Transact-SQL). Salinan
USE AdventureWorks2008R2; GO JIKA object_id (N'dbo. Ufn_FindReports ', N'TF') IS NOT NULL
    
DROP FUNGSI dbo.ufn_FindReports; GO CREATE FUNGSI dbo.ufn_FindReports (@ InEmpID INTEGER) RETURNS @ retFindReports TABEL (
    
Int primary key EmployeeID TIDAK NULL,
    
FirstName nvarchar (255) NOT NULL,
    
LastName nvarchar (255) NOT NULL,
    
JobTitle nvarchar (50) NOT NULL,
    
RecursionLevel int NOT NULL ) - Pengembalian satu set hasil yang berisi daftar semua karyawan yang melapor kepada - Karyawan tertentu secara langsung atau tidak langsung .* / AS BEGIN DENGAN EMP_cte (EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) - nama CTE dan kolom
    
AS (
        
p.LastName SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName,, e.JobTitle, 0 - Dapatkan daftar awal Karyawan untuk n Manager
        
DARI HumanResources.Employee e INNER JOIN p Person.Person ON p.BusinessEntityID = e.BusinessEntityID
        
WHERE e.BusinessEntityID = @ InEmpID
        
UNION ALL
        
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1 - Gabung anggota rekursif untuk jangkar
        
DARI HumanResources.Employee e
            
INNER JOIN EMP_cte
            
ON e.OrganizationNode.GetAncestor (1) = EMP_cte.OrganizationNode INNER JOIN p Person.Person ON p.BusinessEntityID = e.BusinessEntityID
        
) - Salin kolom yang diperlukan untuk hasil fungsi
   
INSERT @ retFindReports
   
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
   
DARI EMP_cte
   
RETURN END; GO - Contoh pemanggilan SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel DARI dbo.ufn_FindReports (1);
GO


D. Membuat fungsi CLR
Contoh berikut mengasumsikan bahwa SQL Server Database Engine Sampel dipasang di lokasi default dari komputer lokal dan aplikasi sampel StringManipulate.csproj dikompilasi. Untuk informasi lebih lanjut, lihat Pertimbangan untuk Instalasi Server SQL dan Database Sampel Sampel.
Misalnya menciptakan CLR len_s fungsi. Sebelum fungsi ini dibuat, perakitan SurrogateStringFunction.dll terdaftar dalam database lokal. Salinan
MENYATAKAN @ SamplesPath nvarchar (1024); - Anda mungkin harus mengubah nilai dari variabel ini jika Anda memiliki - Instal sampel di lokasi lain selain lokasi default. SELECT @ SamplesPath = REPLACE (physical_name, 'Microsoft SQL Server \ MSSQL10_5.MSSQLSERVER \ MSSQL \ DATA \ master.mdf', 'Microsoft SQL Server \ 90 \ Samples \ Mesin \ Programmability \ CLR \')
    
DARI master.sys.database_files
    
WHERE nama 'master' =;
CREATE MAJELIS [SurrogateStringFunction] DARI @ SamplesPath + 'StringManipulate \ CS \ StringManipulate \ bin \ debug \ SurrogateStringFunction.dll' DENGAN EXTERNAL_ACCESS = PERMISSION_SET; GO
CREATE FUNCTION [dbo] [len_s]. (@ Str nvarchar (4000)) PENGEMBALIAN bigint . SEBAGAI NAMA [SurrogateStringFunction] LUAR [Microsoft.Samples.SqlServer.SurrogateStringFunction] [Lens].; GO
Untuk contoh bagaimana untuk membuat tabel CLR-fungsi bernilai, lihat Tabel-Valued CLR Fungsi. Lihat Juga Referensi ALTER FUNGSI (Transact-SQL) DROP FUNGSI (Transact-SQL) OBJECTPROPERTYEX (Transact-SQL) sys.sql_modules (Transact-SQL) sys.assembly_modules (Transact-SQL) EXECUTE (Transact-SQL) EVENTDATA (Transact-SQL) Other Resources User-Defined Fungsi (Database Engine) CLR User-Defined Fungsi