KB4538581 - DÜZELTME: SQL Server 2022 ve 2019'da skaler UDF Satır içi sorunları

Uygulandığı Öğe
SQL Server 2019 on Windows (all editions) SQL Server 2019 on Linux (all editions) SQL Server 2022 on Windows (all editions) SQL Server 2022 on Linux (all editions)

Belirtiler

Transact-SQL'de uygulanan ve tek bir veri değeri döndüren User-Defined İşlevler (UDF'ler), T-SQL Skaler User-Defined İşlevleri (UDF'ler) olarak bilinir.

Skaler UDF Satır İçi özelliği, Microsoft SQL ServerSQL Server 2019'da tanıtıldı. Bu özellik, UDF yürütmenin ana performans sorunu olduğu T-SQL Skaler UDF'lerini çağıran sorguların performansını artırabilir. T-SQL Skaler UDF Satır İçi, satır içi UDF'leri otomatik olarak ilişkisel ifadelere dönüştürür.

Bu toplu güncelleştirme (CU), Skaler UDF Satır İçi kullanan bir sorgunun hata iletisi veya beklenmeyen sonuçlar döndürebildiği senaryolar için aşağıdaki alanlarda çeşitli düzeltmeler içerir:

  • Tür uyuşmazlığı hatası, UDF'nin dönüş türü a sql_variant ise oluşur (SQL ServerSQL Server 2019 CU2).
  • UDF çağrısısp_executesql, yürütmeyi iptal eder (SQL ServerSQL Server 2019 CU2'ye eklenmiştir).
  • İlişkili GOTO bir komut olmadan etiketlere başvuran UDF'ler yanlış sonuçlar döndürür (SQL ServerSQL Server 2019 CU2'ye eklenmiştir).
  • Yetersiz bellek koşulları ve bellek sızıntıları, çok büyük skaler UDF'ler nedeniyle oluşur (SQL ServerSQL Server 2019 CU2).
  • condition (IF-ELSE) deyimlerinde kullanılan başlatılmamış değişkenler hatalara neden olur (SQL ServerSQL Server 2019 CU2'ye eklenmiştir).
  • Bir UDF'de sql_variant parametre varsa açık dönüştürme hatası oluşur (SQL ServerSQL Server 2019 CU7'ye eklenmiştir).
  • Skaler işlev başvuruyorsa CHECKSUM hata oluşur (SQL ServerSQL Server 2019 CU7'ye eklenmiştir).
  • Birçok skaler ifade yeniden değerlendirmesine sahip UDF çağrısı, verimsiz bir zamanlayıcı hatasına neden olabilir (SQL ServerSQL Server 2019 CU7'ye eklenmiştir).
    Not: Bu sorunun düzeltmesi bazen performansta gerilemeye neden olabilir. Bu performans gerilemesinin etkisini azaltmak için, izleme bayrağı (TF) 13156'yı açarak özgün düzeltmeyi devre dışı bırakabilirsiniz.
    Microsoft, bu performans gerilemesine yönelik bir düzeltme üzerinde çalışmaktadır ve bu düzeltme gelecekteki bir toplu güncelleştirmede kullanıma sunulacaktır.
  • UDF başvuru sorgusu kullanıyorsa OPTION (RECOMPILE) hata oluşur (SQL ServerSQL Server 2019 CU7).
  • Görünümler satır içi UDF'leri çağırırsa izin hataları oluşur (SQL ServerSQL Server 2019 CU9'a eklenmiştir).
  • XEvent kullanılırsa query_tsql_scalar_udf_inlined erişim ihlalleri oluşur (SQL ServerSQL Server 2019 CU9'a eklenmiştir).
  • Tutarsız davranış Skaler UDF Satır İçi sorgu ipucuna QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n uymadığından oluşur (SQL ServerSQL Server 2019 CU9 bölümüne eklenmiştir).
  • Satır içi UDF'ler, verimsiz zamanlayıcı hatalarına neden olabilecek toplamalar içerir (SQL ServerSQL Server 2019 CU9'a eklenmiştir).
  • Yetersiz bellek hataları, koşullu bloklarda aynı değişken üzerinde bir dizi skaler işlem nedeniyle oluşur (SQL ServerSQL Server 2019 CU9'a eklenmiştir).
  • CU9'a yükselttikten sonra, bir nesne giriş parametresi olarak kullanılan skaler satır içi UDF'ye (UDF2) sahip skaler bir satır içi kullanılabilir UDF'yi (UDF1) çağırırsa erişim ihlali oluşur (SQL ServerSQL Server 2019 CU11'e eklenmiştir).
  • Satır içi UDF'ler hatalara neden olabilir ve 6846, 1011 ve 107 hata kodları oluşturabilir (SQL ServerSQL Server 2019 CU11'e eklenmiştir).
  • Sistem yöneticisi olmayan hesap olarak çalıştırılan satır içi UDF'ler şu hata iletisini döndürebilir: "Geçerli komutta önemli bir hata oluştu. Varsa, sonuçlar atılmalıdır" (SQL ServerSQL Server 2019 CU16 bölümüne eklenmiştir).
  • Eş anlamlılar kullanılarak UDF'ler içinde geçici tablolar çağrılırsa erişim ihlali oluşur (Microsoft SQL ServerSQL Server 2022 CU1 ve SQL ServerSQL Server 2019 CU19).
  • UDF tanımı yalnızca GOTO etiketler ve bir RETURN deyim içeriyorsa (SQL ServerSQL Server 2022 CU1 ve SQL ServerSQL Server 2019 CU19) erişim ihlali oluşur.
  • Skaler UDF, Skaler UDF Satır İçi özelliği açıldığında sonuçları farklı tarih ve saat biçimlerinde döndürür (SQL ServerSQL Server 2022 CU3 ve SQL ServerSQL Server 2019 CU20'ye eklenmiştir).
  • Yan tümcesi olan GROUP BY bir sorgu, toplama işlevi olmayan bir SELECT deyimde satır içi UDF'ler kullanıyorsa bir döküm dosyası oluşturulur (SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26).
  • İç içe geçirme düzeyi aşılmasa bile Skaler UDF Satır İçi özelliği açıksa "En fazla depolanmış yordam, işlev, tetikleyici veya görünüm iç içe geçme düzeyi aşıldı (sınır 32)" hatası oluşur (SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26'ya eklenmiştir).
  • Skaler UDF Satır İçi özelliği açıksa bellek bozulması oluşur sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf (SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26).
  • Skaler UDF Satır İçi kombinasyonu ve OPTION (RECOMPILE) aynı sorguda (SQL ServerSQL Server 2022 CU17 ve SQL ServerSQL Server 2019 CU31) kombinasyonu nedeniyle yanlış sonuçlar oluşur.

Bu toplu güncelleştirme aşağıdaki senaryolarda da satır içi işlemleri engeller :

  • UDF belirli içsel işlevlere başvuruyorsa (örneğin, @@ROWCOUNT), UDF satır içi ise sonuçları değiştirebilir (SQL ServerSQL Server 2019 CU2'ye eklenmiştir).
  • Toplama işlevleri skaler UDF'ye parametre olarak geçirilirse (SQL ServerSQL Server 2019 CU2'ye eklenir).
  • UDF yerleşik görünümlere başvuruyorsa (örneğin: OBJECT_ID) (SQL ServerSQL Server 2019 CU2'ye eklenmiştir).
  • UDF, XML yöntemlerini kullanıyorsa (SQL ServerSQL Server 2019 CU4'e eklenmiştir).
  • UDF, yan tümceyi ORDER BY kullanan ancak kullanmayan TOP 1 bir SELECT deyim içeriyorsa (SQL ServerSQL Server 2019 CU4'e eklenmiştir).
  • SELECT Deyim, yan tümceyle ORDER BY birlikte bir atama gerçekleştirirse (örneğin, SELECT @x = @x +1 FROM table ORDER BY column_name) (SQL ServerSQL Server 2019 CU4 içine eklenmiştir).
  • UDF birden çok RETURN deyim içeriyorsa (SQL ServerSQL Server 2019 CU5'e eklenmiştir).
  • UDF bir RETURN deyimden çağrılırsa (SQL ServerSQL Server 2019 CU5'e eklenmiştir).
  • UDF işleve başvuruyorsa STRING_AGG (SQL ServerSQL Server 2019 CU5'e eklenmiştir).
  • UDF tanımı uzak tablolara başvuruyorsa (SQL ServerSQL Server 2019 CU6'ya eklenmiştir).
  • UDF çağırma sorgusu GROUPING SETS, CUBE, veya ROLLUP kullanıyorsa (SQL ServerSQL Server 2019 CU6'ya eklenmiştir).
  • UDF çağırma sorgusu, atama için UDF parametresi olarak kullanılan bir değişken içeriyorsa (örneğin, SELECT @y=2, @x=UDF(@y)) (SQL ServerSQL Server 2019 CU6'ya eklenmiştir).
  • UDF şifrelenmiş sütunlara başvuruyorsa (SQL ServerSQL Server 2019 CU11'de eklenmiştir).
  • UDF, SQL ServerSQL Server 2019 CU11'e başvurular WITH XMLNAMESPACES içeriyorsa (SQL ServerSQL Server 2019 CU11'e eklenmiştir).
  • UDF'yi çağıran sorguda Ortak Tablo İfadeleri (CTE'ler) varsa (SQL ServerSQL Server 2019 CU11'e eklenmiştir).
  • UDF tanımı, geçici tablolar veya geçici tablolar için eş anlamlılar içeriyorsa (SQL ServerSQL Server 2022 CU1 ve SQL ServerSQL Server 2019 CU19 bölümlerine eklenmiştir).
  • UDF tanımında birden çok atama sütununda bir DISTINCT yan tümce ile birlikte bir SELECT ifade varsa (SQL ServerSQL Server 2022 CU4 ve SQL ServerSQL Server 2019 CU20'ye eklenmiştir).
  • UDF, yan tümceyi ve birden çok değişken atamasını TABLESAMPLE PERCENT kullanan bir SELECT deyim içeriyorsa (SQL ServerSQL Server 2022 CU7'ye eklenmiştir).
  • UDF içeren dizinlenmiş bir görünüm tarafından başvurulan bir tabloda bir INSERT sorgu varsa (SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26).

SQL Server 2019 CU2'ye yükselttikten sonra, ancak SQL Server 2019 CU5'e yükseltmeden önce, UDF'nin satır içi için uygun olup olmadığını yeniden değerlendirmeniz gerekir. Bunu yapmak için, aşağıdaki yöntemlerden birini kullanarak uygun skaler UDF'leri yenileyin:

  • Geçerli skaler UDF'ler için çalıştırın sp_refreshsqlmodule . Bu sistem saklı yordamı hakkında daha fazla bilgi için bkz. sp_refreshsqlmodule (Transact-SQL).
  • Var olan tanımları, izinleri ve ayarlanan özellikleri kullanarak var olan skaler UDF'yi değiştirin veya yeniden oluşturun. Daha fazla bilgi için bkz. ALTER İŞLEVİ (Transact-SQL).

Aşağıdaki komut, mevcut satır içi skaler UDF'lerin meta verilerini yenilemek için bir betik oluşturur:


/*

Generates a script that can be used to refresh all active inlineable scalar UDFs.

Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.

*/

SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)

+ ']'';' AS 'RefreshStatement'

FROM sys.sql_modules

WHERE is_inlineable = 1

AND inline_type = 1;

GO

Not: SQL Server 2019 CU5'e yükselttikten sonra, derleme sırasında UDF satırsızlığını otomatik olarak türetmeye devam edeceğiz.

Çözüm

Bu sorun, SQL ServerSQL Server için aşağıdaki toplu güncelleştirmelerde düzeltildi:

SQL Server toplu güncelleştirmeleri hakkında

SQL Server için her yeni toplu güncelleştirme, önceki toplu güncelleştirmeye dahil edilen tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. SQL Server için en son toplu güncelleştirmelere göz atın:

Durum

Microsoft bunun, "Şunlar için geçerlidir" bölümünde listelenen Microsoft ürünlerinde sorun olduğunu onaylamıştır.

Başvurular

Microsoft'un yazılım güncelleştirmelerini tanımlamak için kullandığı terminoloji hakkında bilgi edinin.