Burada birkaç farklı sorunuz var.
S: ANSI standart SQL işlevleri nelerdir?
ANSI standart fonksiyonları AVG, COUNT, MIN, MAX gibi şeylerdir. 1992 ANSI standardında yer alıyorlar , ancak bu kuru ve sıkıcı bir okuma heck.
S: ANSI standart SQL işlevleri veritabanındaki verileri değiştiriyor mu?
Hayır. Verileri değiştirmek için bunları kullanabilirsiniz - örneğin şunu söyleyebilirim:
INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales
Ancak, kendi başlarına, sadece bir AVG, COUNT, MIN, MAX vb. Kullanımı veritabanınızdaki verileri kalıcı olarak değiştirmemelidir.
S: ANSI standardı kendi işlevlerimi yazmama izin veriyor mu?
Evet, ancak tam uygulama satıcıdan satıcıya değişir. Yazdığınız işlevler ANSI dil standardına uygun olabilir, ancak işlevinizin içinde yaptıklarınız yan etkiler yaratmak gibi korkunç derecede korkunç olabilir.
- Amaçlanan davranışı tartışırken , platformlar arası bir cevap almak mümkündür.
- Yan etkileri tartışırken , öyle değil.
S: Veri yazmak için kendi işlevimi oluşturabilir miyim?
Neden eminseniz, yaratıcıysanız. Ben bir Microsoft SQL Server kullanıcısıyım, bu yüzden bu platforma odaklanacağım. Books Online'ın işlev sayfası şöyle diyor:
Kullanıcı tanımlı işlevler, veritabanı durumunu değiştiren eylemleri gerçekleştirmek için kullanılamaz.
Hangi diyorum ki:
Sen benim gerçek babam değilsin.
İşte kuralları nasıl kıracağım. Uyarı: Çok kötü fikirler geliyor.
- İşlevinizde, bu kötü amaç için özel olarak oluşturulan yeni bir tabloyu sorgulayın ve sonra tabloyu belirli ifadeler için izleyen ve ardından bir eylemi tetikleyen bir şey oluşturun (Genişletilmiş Olaylar, denetim veya Profiler izlemesi). Bu belirli ifadelere dayanarak iş yapmak için bir Rube Goldberg çeşit mekanizmasını birbirine bağlayabilirsiniz.
- Fonksiyonda, CLR kodunu arayın - heck, bir web servisini bile arayabilirsiniz . Bu web hizmeti çok iyi kendi veritabanına veri itebilir.
- İşlevde, xp_cmdshell'i arayın ve komut isteminden bir şey yapın. (HT @AaronBertrand yorumlarda.)
Tüm bu örneklerin performans ve işlem tutarlılığı şeklinde büyük dezavantajları vardır. Sadece teorik olarak yapılıp yapılamayacağını sordunuz ve cevap evet. Bunlardan hiçbirini kendi kodumda kullanmazdım - geri çekilip, "Burada elde etmeye çalıştığım iş hedefi nedir ve performans ve işlem tutarlılığı sağlamak için yapabileceğim bir yol var. ?" Bunlarla ilgili özel tavsiyeler almak isterseniz, ayrıntılarla birlikte ayrı bir Stack sorusu sorarım.