Aracılığıyla paylaş


BAZı veri türlerini ve yaygın olmayan işlemleri işlemede SQL Server ve Azure SQL Veritabanı geliştirmeleri

Bu makalede, SQL Server veritabanınızdaki kalıcı yapıların yükseltme uyumluluk düzeyinin bir parçası olarak nasıl doğrulanabileceği ve uyumluluk düzeyini yükselttikten sonra etkilenen yapıların nasıl yeniden oluşturulabileceği anlatılır.

Özgün ürün sürümü: SQL Server 2017, SQL Server 2016
Özgün KB numarası: 4010261

Microsoft SQL Server 2016 ve Azure SQL Veritabanı'daki veritabanı altyapısı, veri türü dönüştürmelerinde ve diğer birçok işlemde iyileştirmeler içerir. Bu geliştirmelerin çoğu, kayan nokta türleriyle ve klasik tarih saat türleriyle çalışırken daha fazla duyarlık sunar.

Bu iyileştirmelerin tümü, en az 130 veritabanı uyumluluk düzeyi kullandığınızda kullanılabilir. Bu, bazı (çoğunlukla yaygın olmayan) ifadelerde, veritabanını uyumluluk düzeyi 130 veya daha yüksek bir ayara yükseltdikten sonra bazı giriş değerleri için farklı sonuçlar görebileceğiniz anlamına gelir. Bu sonuçlar aşağıdakilere yansıtılabilir:

  • veritabanında kalıcı yapılar
  • kısıtlamalara CHECK tabi olan eklenen tablo verileri
  • kalıcı hesaplanan sütunlar
  • hesaplanan sütunlara başvuran dizinler
  • filtrelenmiş dizinler ve dizinlenmiş görünümler.

SQL Server'ın önceki bir sürümünde oluşturulmuş bir veritabanınız varsa, SQL Server 2016 veya sonraki bir sürümüne yükselttikten sonra ve veritabanı uyumluluk düzeyini değiştirmeden önce ek doğrulama yapmanızı öneririz.

Veritabanınızdaki kalıcı yapılardan herhangi birinin bu değişikliklerden etkilendiğini fark ederseniz, veritabanı uyumluluk düzeyini yükselttikten sonra etkilenen yapıları yeniden derlemenizi öneririz. Bunu yaparak SQL Server 2016 veya sonraki sürümlerdeki bu geliştirmelerden yararlanabilirsiniz.

Bu makalede, veritabanınızdaki kalıcı yapıların uyumluluk düzeyi 130 veya daha yüksek bir ayara yükseltmenin bir parçası olarak nasıl doğrulanabileceği ve uyumluluk düzeyini değiştirdikten sonra etkilenen yapıların nasıl yeniden oluşturulabileceği açıklanmaktadır.

Veritabanı uyumluluk düzeyine yükseltme sırasında doğrulama adımları

SQL Server 2016'dan başlayarak, hem SQL Server hem de Azure SQL Veritabanı aşağıdaki işlemlerin duyarlığında iyileştirmeler içerir:

  • Yaygın olmayan veri türü dönüştürmeleri. Bunlar şunları içerir:
    • Float/integer to/from datetime/smalldatetime
    • Gerçek/kayan/sayısal/para/smallmoney
    • Kayan gerçek
  • ve ile ilgili DATEPART/DATEDIFF bazı durumlar DEGREES
  • CONVERT stil NULL kullanan

Uygulamanızda ifade değerlendirmesinde bu iyileştirmeleri kullanmak için veritabanlarınızın uyumluluk düzeyini 130 (SQL Server 2016 için) veya 140 (SQL Server 2017 ve Azure SQL Veritabanı için) olarak değiştirin. Tüm değişiklikler hakkında daha fazla bilgi ve değişiklikleri gösteren bazı örnekler için Ek A bölümüne bakın.

Veritabanındaki aşağıdaki yapılar bir ifadenin sonuçlarını kalıcı hale gelebilir:

  • Kısıtlamalara CHECK tabi tablo verileri
  • Kalıcı hesaplanan sütunlar
  • Anahtarda veya dahil edilen sütunlarda hesaplanan sütunlar kullanan dizinler
  • Filtrelenmiş dizinler
  • Dizine alınan görünümler

Aşağıdaki senaryoyu değerlendirin:

  • SQL Server'ın önceki bir sürümü tarafından oluşturulmuş veya SQL Server 2016 veya sonraki bir sürümde oluşturulmuş ancak uyumluluk düzeyi 120 veya daha önceki bir düzeyde olan bir veritabanınız var.

  • Duyarlığı veritabanınızdaki kalıcı yapıların tanımı kapsamında geliştirilmiş tüm ifadeleri kullanırsınız.

Bu senaryoda, uyumluluk düzeyi 130 veya üzeri kullanılarak uygulanan duyarlık geliştirmeleri tarafından etkilenen kalıcı yapılarınız olabilir. Bu durumda kalıcı yapıları doğrulamanızı ve etkilenen tüm yapıları yeniden oluşturmanızı öneririz.

Etkilenen yapılarınız varsa ve uyumluluk düzeyini değiştirdikten sonra bunları yeniden oluşturamıyorsanız, biraz farklı sorgu sonuçlarıyla karşılaşabilirsiniz. Sonuçlar belirli bir dizinin, hesaplanan sütunun veya görünümün kullanılıp kullanılmadığına ve tablodaki verilerin kısıtlama ihlali olarak kabul edilip edilmeyeceğine bağlıdır.

Not

SQL Server'da İzleme Bayrağı 139

Genel izleme bayrağı 139, SQL Server 2016 CU3 ve Hizmet Paketi (SP) 1'de, DBCC CHECKTABLEgibi DBCC CHECKDBDBCC denetim komutları kapsamında doğru dönüştürme semantiğini zorlamak için ve DBCC CHECKCONSTRAINTS daha önceki uyumluluk düzeyine sahip bir veritabanında uyumluluk düzeyi 130 ile sunulan geliştirilmiş duyarlığı ve dönüştürme mantığını analiz ettiğinizde kullanıma sunulmuştur.

Uyarı

İzleme bayrağı 139, üretim ortamında sürekli olarak etkinleştirilmek üzere tasarlanmamıştır ve yalnızca bu makalede açıklanan veritabanı doğrulama denetimlerini gerçekleştirmek için kullanılmalıdır. Bu nedenle, doğrulama denetimleri tamamlandıktan sonra aynı oturumda kullanılarak dbcc traceoff (139, -1) devre dışı bırakılmalıdır.

İzleme bayrağı 139, SQL Server 2016 CU3 ve SQL Server 2016 SP1'den başlayarak desteklenir.

Uyumluluk düzeyini yükseltmek için şu adımları izleyin:

  1. Etkilenen kalıcı yapıları tanımlamak için doğrulama gerçekleştirin:
    1. komutunu çalıştırarak DBCC TRACEON(139, -1)139 izleme bayrağını etkinleştirin.
    2. CHECKCONSTRAINTS ve komutlarını çalıştırınDBCC CHECKDB/TABLE.
    3. komutunu çalıştırarak DBCC TRACEOFF(139, -1)139 izleme bayrağını devre dışı bırakın.
  2. Veritabanı uyumluluk düzeyini 130 (SQL Server 2016 için) veya 140 (SQL Server 2017 ve Azure SQL Veritabanı için) olarak değiştirin.
  3. 1. adımda tanımladığınız tüm yapıları yeniden oluşturun.

Not

İzleme bayraklarını ayarlama Azure SQL Veritabanı izleme bayrakları Azure SQL Veritabanı'da desteklenmez. Bu nedenle, doğrulama gerçekleştirmeden önce uyumluluk düzeyini değiştirmeniz gerekir:

  1. Veritabanı uyumluluk düzeyini 140'a yükseltin.
  2. Etkilenen kalıcı yapıları tanımlamak için doğrulayın.
  3. 2. adımda tanımladığınız yapıları yeniden oluşturun.
  • Ek A , tüm duyarlık iyileştirmelerinin ayrıntılı bir listesini içerir ve her biri için bir örnek sağlar.

  • Ek B , doğrulama yapmak ve etkilenen yapıları yeniden oluşturmak için ayrıntılı bir adım adım işlem içerir.

  • Ek C ve Ek D , veritabanında etkilenmiş olabilecek nesneleri saptamaya yardımcı olacak betikler içerir. Bu nedenle, doğrulamalarınızın kapsamını daraltabilir ve denetimleri çalıştırmak için karşılık gelen betikler oluşturabilirsiniz. Veritabanlarınızdaki kalıcı yapıların uyumluluk düzeyi 130'daki duyarlık geliştirmelerinden etkilenip etkilenmediğini en kolay şekilde belirlemek için, doğru doğrulama denetimlerini oluşturmak için Ek D'de betiği çalıştırın ve doğrulama yapmak için bu betiği çalıştırın.

Ek A: Uyumluluk düzeyindeki değişiklikler 130

Bu ek, uyumluluk düzeyi 130'da ifade değerlendirmesine yönelik iyileştirmelerin ayrıntılı listelerini sağlar. Her değişiklik ilişkili bir örnek sorgu içerir. Sorgular, uyumluluk düzeyi 130 kullanan bir veritabanına kıyasla 130 öncesi uyumluluk düzeyi kullanan bir veritabanında yürütme arasındaki farkları göstermek için kullanılabilir.

Aşağıdaki tablolarda veri türü dönüştürmeleri ve ek işlemler listelemektedir.

Veri türü dönüştürmeleri

Kaynak Amaç Değiştir Örnek sorgu Uyumluluk düzeyi < 130 sonucu Uyumluluk düzeyi sonucu = 130
float, real, numeric, decimal, , moneyveya smallmoney datetime veya smalldatetime Yuvarlama duyarlığı artırın. Daha önce gün ve saat ayrı ayrı dönüştürülüyordu ve siz birleştirmeden önce sonuçlar kesiliyordu. DECLARE @f FLOAT = 1.2 DECLARE @d DATETIME = @f SELECT CAST(@d AS FLOAT) 1.19999996141975 1.2
datetime bigint, int, or smallint Saat kısmı tam olarak yarım gün olan veya yarım günlük bir değer çizgisine sahip negatif bir tarih saat yanlış yuvarlanır (sonuç 1'e kadar kapalıdır). DECLARE @h DATETIME = -0.5 SELECT @h, CAST(@h AS INT) 0 -1
datetime veya smalldatetime float, real, numeric, money, or smallmoney Bazı durumlarda son 8 bit duyarlık için geliştirilmiş duyarlık. DECLARE @p0 DATETIME = '1899-12-31 23:58:00.470' DECLARE @f FLOAT = CONVERT(FLOAT, @p0) SELECT @f, CAST(@f AS VARBINARY(8)) -0,00138344907407406, 0xBF56AA9B21D85800 -0,00138344907407407, 0xBF56AA9B21D8583B
float real Sınır denetimleri daha az katıdır. SELECT CAST (3.40282347000E+038 AS REAL) Aritmetik taşma 3.402823E+38
numeric, money ve smallmoney float Giriş ölçeği sıfır olduğunda, sayısalın dört bölümünü birleştirdiğinizde yuvarlama kararsızı olur. DECLARE @n NUMERIC(38, 0)= 41538374868278625639929991208632320 DECLARE @f FLOAT = CAST(@n AS FLOAT) SELECT CONVERT(BINARY(8), @f) 0x4720000000000000 0x4720000000000001
numeric, money ve smallmoney float Giriş ölçeği sıfırdan farklı olduğunda, 10^ölçeğe böldüğünüzde bir yuvarlama kesinlik olur. DECLARE @n NUMERIC(18, 10) = 12345678.0123456781 DECLARE @f FLOAT = CAST(@n AS FLOAT) SELECT CAST(@f AS BINARY(8)) 0x41678C29C06522C4 0x41678C29C06522C3
real veya float sayısal Bazı durumlarda iyileştirilmiş yuvarlama duyarlığı. DECLARE @f float = 0.14999999999999999 SELECT CAST(@f AS numeric(1, 1)) 0,2 0,1
real veya float sayısal Bazı durumlarda 16'dan fazla basamağı yuvarladığınızda duyarlık geliştirildi. DECLARE @v decimal(38, 18) = 1E-18 SELECT @v 0.000000000000000000 0.000000000000000001
real veya float money veya smallmoney Bazı durumlarda büyük sayıları dönüştürürken doğruluk iyileştirildi. DECLARE @f float = 2SET @f = POWER(@f, 49) + POWER(@f, -2) SELECT CAST(@f AS money) 562949953421312.2048 562949953421312.25
(n)(var)char numeric 39 karakterden uzun bir giriş artık aritmetik taşma tetiklemez. DECLARE @value nchar(100) = '1.11111111111111111111111111111111111111' SELECT CAST(@value AS decimal(2,1)) Aritmetik taşma 1.1
(n)(var)char bit Öndeki boşlukları ve işaretleri destekler. DECLARE @value nvarchar(100) = '1' SELECT CAST(@value AS bit) '1' değeri veri türü bitine dönüştürülürken nvarchar dönüştürme başarısız oldu. 1
datetime time veya datetime2 Daha yüksek duyarlıklı tarih/saat türlerine dönüştürdüğünüzde geliştirilmiş duyarlık. Tarih saat değerlerinin saniyenin 300'ünde 1/1'ini temsil eden keneler olarak depolandığını unutmayın. Daha yeni saat ve datetime2 türleri, basamak sayısının duyarlıkla eşleştiği ayrı basamak sayısını depolar. DECLARE @value datetime = '1900-01-01 00:00:00.003' SELECT CAST(@value AS time(7)) 00:00:00.0030000 00:00:00.0033333
time veya datetime2 datetime Bazı durumlarda yuvarlama iyileştirildi. DECLARE @value time(4) = '00:00:00.0045' SELECT CAST(@value AS datetime) 1900-01-01 00:00:00.007 1900-01-01 00:00:00.003

İşlem

İşlem Değiştir Örnek sorgu Uyumluluk düzeyi <130 sonucu Uyumluluk düzeyi 130 sonucu
RADIANS Sayısal veri türünü kullanan veya DEGREES yerleşik işlevini kullanın. DEGREES daha önce 180/pi ile çarpıldığı pi/180'e bölünür. için RADIANSbenzer. DECLARE @arg1 numeric = 1 SELECT DEGREES(@arg1) 57.295779513082323000 57.295779513082322865
Bir işlenenin ölçeği sonucun ölçeğinden büyük olduğunda sayısal toplama veya çıkarma. Yuvarlama her zaman toplama veya çıkarmadan sonra gerçekleşirken, daha önce bazen daha önce gerçekleşebilirdi. DECLARE @p1 numeric(38, 2) = -1.15 DECLARE @p2 numeric(38, 1) = 10 SELECT @p1 + @p2 8.8 8.9
CONVERT stile sahip NULL . CONVERT stiliyle, NULL hedef tür sayısal olduğunda her zaman döndürür NULL . SELECT CONVERT (SMALLINT, '0', NULL); 0 NULL
DATEPART tarih saat veri türüyle birlikte mikrosaniye veya nanosaniye seçeneğini kullanır. Değer artık mikro veya nanosaniyeye dönüştürülmeden önce milisaniye düzeyinde kesilmez. DECLARE @dt DATETIME = '01-01-1900 00:00:00.003'; SELECT DATEPART(MICROSECOND, @dt); 3000 3333
DATEDIFF tarih saat veri türüyle birlikte mikrosaniye veya nanosaniye seçeneğini kullanır. Değer artık mikro veya nanosaniyeye dönüştürülmeden önce milisaniye düzeyinde kesilmez. DECLARE @d1 DATETIME = '1900-01-01 00:00:00.003' DECLARE @d2 DATETIME = '1900-01-01 00:00:00.007' SELECT DATEDIFF(MICROSECOND, @d1, @d2) 3000 3333
Milisaniye için sıfır olmayan değerlerle datetime ve datetime2 değerleri arasında karşılaştırma. Datetime2 değeriyle karşılaştırma çalıştırdığınızda, tarih saat değeri artık milisaniye düzeyinde kesilmemektedir. Bu, daha önce eşit olan belirli değerlerin artık eşit olmadığı anlamına gelir. DECLARE @d1 DATETIME = '1900-01-01 00:00:00.003' DECLARE @d2 DATETIME2(3) = @d1 SELECT CAST(@d1 AS datetime2(7)), @d2SELECT CASE WHEN (@d1=@d2) THEN 'equal' ELSE 'unequal' END 1900-01-01 00:00:00.0030000, 1900-01-01 00:00:00.003 eşittir 1900-01-01 00:00:00.0033333, 1900-01-01 00:00:00.003 eşit değil
ROUND veri türünü kullanan float işlev. Yuvarlama sonuçları farklıdır. SELECT ROUND(CAST (-0.4175 AS FLOAT), 3) -0.418 -0.417

Ek B: Kalıcı yapıları doğrulama ve güncelleştirme adımları

Veritabanının uyumluluk düzeyi 130'daki değişikliklerden etkilenen kalıcı yapılara sahip olup olmadığını belirlemenizi ve etkilenen yapıları yeniden oluşturmanızı öneririz.

Bu yalnızca SQL Server'ın eski bir sürümünde veya 130'dan düşük bir uyumluluk düzeyi kullanılarak veritabanında oluşturulan kalıcı yapılar için geçerlidir. Olası olarak etkilenen kalıcı yapılar şunlardır:

  • Kısıtlamalara CHECK tabi tablo verileri
  • Kalıcı hesaplanan sütunlar
  • Anahtarda veya dahil edilen sütunlarda hesaplanan sütunlar kullanan dizinler
  • Filtrelenmiş dizinler
  • Dizine alınan görünümler

Bu durumda aşağıdaki yordamı çalıştırın.

1. Adım: Veritabanı uyumluluk düzeyini doğrulama

  1. Veritabanını görüntüleme veya veritabanının uyumluluk düzeyini değiştirme bölümünde belgelenen yordamı kullanarak veritabanınızın uyumluluk düzeyini denetleyin.
  2. Veritabanı uyumluluk düzeyi 130'dan düşükse, uyumluluk düzeyini 130'a yükseltmeden önce 2. Adımda açıklanan doğrulamayı gerçekleştirmenizi öneririz.

2. Adım: Etkilenen kalıcı yapıları tanımlama

Veritabanının, uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığından etkilenen kalıcı yapılar içerip içermediğini aşağıdaki şekilde belirleyin:

  • DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS, veritabanındaki tüm yapıları doğrular.
  • DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS, tek bir tabloyla ilgili yapıları doğrular.

Kalıcı değerlerin hesaplanan değerlerle karşılaştırıldığından emin olmak ve fark olan durumlara bayrak eklemek için bu seçenek WITH EXTENDED_LOGICAL_CHECKS gereklidir. Bu denetimler kapsamlı olduğundan, bu seçeneği kullanan deyimlerin DBCC çalışma zamanı, deyimleri seçenek olmadan çalıştırmaktan DBCC daha uzundur. Bu nedenle, büyük veritabanları için tek tek tabloları saptamak için kullanılması DBCC CHECKTABLE önerilmektedir.

DBCC CHECKCONSTRAINTS kısıtlamaları doğrulamak CHECK için kullanılabilir. Bu deyim, veritabanında veya tablo düzeyinde kullanılabilir.

DBCC CHECK denetimlerin çevrimiçi iş yükü üzerindeki olası etkisi nedeniyle deyimler her zaman bakım penceresi sırasında çalıştırılmalıdır.

Veritabanı düzeyinde doğrulama

Veritabanı düzeyinde doğrulama, küçük ve orta büyüklükteki veritabanları için uygundur. Büyük veritabanları için tablo düzeyinde doğrulamayı kullanın.

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS , veritabanındaki tüm kalıcı yapıları doğrulamak için kullanılır.

DBCC CHECKCONSTRAINTS , veritabanındaki tüm CHECK kısıtlamaları doğrulamak için kullanılır.

DBCC CHECKCONSTRAINTS kısıtlamaların bütünlüğünü doğrulamak için kullanılır. Veritabanını doğrulamak için aşağıdaki betiği kullanın:

USE [database_name]
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKCONSTRAINTS
GO
DBCC TRACEOFF(139, -1)
GO

İzleme bayrağının kullanılması, denetimlerin uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığı kullanılarak gerçekleştirilmesini sağlar ve veritabanı daha düşük uyumluluk düzeyine sahip olsa bile doğru dönüştürme semantiğini zorlar.

CHECKCONSTRAINTS Deyimi tamamlandıysa ve sonuç kümesi döndürmezse ek bir eylem gerekmez.

Deyimi bir sonuç kümesi döndürmezse, sonuçlardaki her satır kısıtlama ihlalini gösterir ve ayrıca kısıtlamayı ihlal eden değerleri de içerir.

  • Tabloların ve kısıtlamaların adlarını, ihlale neden olan değerlerle ( WHERE sonuç kümesindeki sütun) birlikte kaydedin.

Aşağıdaki örnekte kısıtlaması olan bir CHECK tablo ve daha düşük uyumluluk düzeyleri altında kısıtlamayı karşılayan ancak uyumluluk düzeyi 130'un altındaki kısıtlamayı ihlal eden tek bir satır gösterilmektedir.

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=120
GO
CREATE TABLE dbo.table1
(
    c2 datetime,
    c3 datetime,
    c4 int,
    CONSTRAINT chk1 CHECK (c4= (DATEDIFF (ms, c2,c3)))
)
GO
INSERT dbo.table1 (c2, c3, c4) VALUES
(
    convert(datetime, '1900-01-01 00:00:00.997'),
    convert(datetime, '1900-01-01 00:00:01'), 3
)
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKCONSTRAINTS
GO
DBCC TRACEOFF(139, -1)
GO

komutu CHECKCONSTRAINT aşağıdaki sonuçları döndürür.

Tablo Kısıtlama Konumu
[dbo]. [tablo1] [chk1] [c2] = '1900-01-01 00:00.997' AND [c3] = '1900-01-01 00:00:01.000' AND [c4] = '3'

Bu sonuç, [chk1] kısıtlamasının 'Where' içindeki sütun değerlerinin birleşimi için ihlal edildiğine işaret eder.

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS veritabanındaki tüm kalıcı yapıları doğrular. Tek bir deyim veritabanındaki tüm yapıları doğruladığı için bu en uygun seçenektir. Ancak, deyiminin beklenen çalışma zamanı nedeniyle bu seçenek büyük veritabanları için uygun değildir.

Veritabanının tamamını doğrulamak için aşağıdaki betiği kullanın:

USE [database_name]
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS
GO
DBCC TRACEOFF(139, -1)
GO

İzleme bayrağının kullanılması, denetimlerin uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığı kullanılarak gerçekleştirilmesini sağlar ve veritabanı daha düşük uyumluluk düzeyine sahip olsa bile doğru dönüştürme semantiğini zorlar.

CHECKDB Deyimi başarıyla tamamlanırsa ek bir eylem gerekmez.

deyimi hatalarla tamamlandıysa şu adımları izleyin:

  1. SQL Server Management Studio'daki (SSMS) iletiler bölmesinde bulunan deyiminin DBCC yürütülmesinden elde edilen sonuçları bir dosyaya kaydedin.
  2. Bildirilen hatalardan herhangi birinin kalıcı yapılara ilişkin olduğunu doğrulayın

Tablo 1: Tutarsızlıklar için kalıcı yapılar ve ilgili hata iletileri

Yapı türü etkilendi Gözlemlenen hata iletileri Not alın
Kalıcı hesaplanan sütunlar Msg 2537, Düzey 16 Tablo hatası: nesne kimliği <object_id> , dizin kimliği <index_id> , . Kayıt denetimi (geçerli hesaplanan sütun) başarısız oldu. Değerler şeklindedir. nesne kimliği <object_id> ve dizin kimliği <index_id>
Anahtardaki hesaplanan sütunlara veya eklenen sütunlara başvuran dizinler Filtrelenmiş dizinler Msg 8951 Tablo hatası: '<table_name>' tablosu (kimlik <object_id>). Veri satırının '<index_name>' dizininde eşleşen bir dizin satırı yok (Kimlik <index_id>) Ve/veya 8952 Msg 8952 Tablo hatası: tablo '<table_name>' (Kimlik <table_name>). '' dizinindeki dizin satırı (Kimlik <index_id>) hiçbir veri satırıyla eşleşmiyor. Ayrıca, 8955 ve/veya 8956 ikincil hataları olabilir. Bu, etkilenen tam satırlarla ilgili ayrıntıları içerir. Bunlar bu alıştırma için göz ardı edilebilir. nesne kimliği <object_id> ve dizin kimliği <index_id>
Dizine alınan görünümler Msg 8908 Dizinli '<view_name>' görünümü (nesne kimliği <object_id>), görünüm tanımının ürettiği tüm satırları içermez. Ve/veya Msg 8907 Dizine alınan '<view_name>' görünümü (nesne kimliği <object_id>), görünüm tanımı tarafından üretilmeyen satırları içerir. nesne kimliği <object_id>

Veritabanı düzeyinde doğrulamayı tamamladıktan sonra 3. Adım'a gidin.

Nesne düzeyinde doğrulama

Daha büyük veritabanları için, bakım pencerelerinin boyutunu küçültmek veya genişletilmiş mantıksal denetimleri yalnızca etkilenmiş olabilecek nesnelerle sınırlamak için bir tablodaki veya bir kerede bir görünümdeki yapıları ve kısıtlamaları doğrulamak yararlı olur.

Etkilenen olası tabloları belirlemek için Ek C bölümündeki sorguları kullanın. Ek D bölümündeki betik, Ek C bölümünde listelenen sorgulara göre ve CHECKCONSTRAINTS kısıtlamaları oluşturmak CHECKTABLE için kullanılabilir.

DBCC CHECKCONSTRAINTS

Tek bir tablo veya görünümle ilgili kısıtlamaları doğrulamak için aşağıdaki betiği kullanın:

USE [database_name]

GO

DBCC TRACEON(139, -1)

GO

DBCC CHECKCONSTRAINTS()

GO

DBCC TRACEOFF(139, -1)

GO

İzleme bayrağının kullanılması, denetimlerin uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığı kullanılarak gerçekleştirilmesini sağlar ve veritabanı daha düşük uyumluluk düzeyine sahip olsa bile geliştirilmiş semantiği zorlar.

CHECKCONSTRAINTS Deyimi tamamlandıysa ve sonuç kümesi döndürmezse ek bir eylem gerekmez.

Deyimi bir sonuç kümesi döndürmezse, sonuçlardaki her satır kısıtlama ihlalini gösterir ve ayrıca kısıtlamayı ihlal eden değerleri sağlar.

Tabloların ve kısıtlamaların adlarını, ihlale neden olan değerlerle ( WHERE sonuç kümesindeki sütun) birlikte kaydedin.

DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS

Tek bir tablo veya görünümle ilgili kalıcı yapıları doğrulamak için aşağıdaki betiği kullanın:

USE [database_name]

GO

DBCC TRACEON(139, -1)

GO

DBCC CHECKTABLE() WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS

GO

DBCC TRACEOFF(139, -1)

GO

CHECKTABLE Deyimi başarıyla tamamlanırsa ek bir eylem gerekmez.

deyimi hatalarla tamamlandıysa şu adımları izleyin:

  1. SSMS'deki iletiler bölmesinde bulunan deyiminin DBCC yürütülmesinden elde edilen sonuçları bir dosyaya kaydedin.
  2. Bildirilen hatalardan herhangi birinin Tablo 1'de listelenen kalıcı yapılara ilişkin olduğunu doğrulayın.
  3. Tablo düzeyi doğrulamayı tamamladıktan sonra 3. Adım'a gidin.

3. Adım: Uyumluluk düzeyi 130'a yükseltme

Veritabanının uyumluluk düzeyi zaten 130 ise, bu adımı atlayabilirsiniz.

Aşağıdaki betik kullanılarak veritabanının uyumluluk düzeyi 130 olarak değiştirilebilir:

USE [database_name]

GO

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130

GO

Not

Uyumluluk düzeyi 130'un altında sorgu iyileştirici değişiklikleri olduğundan, uyumluluk düzeyini değiştirmeden önce sorgu deposunu etkinleştirmenizi öneririz. Daha fazla bilgi için Sorgu Deposu Kullanım Senaryoları'nın Daha yeni SQL Server'a yükseltme sırasında performans kararlılığını koruma bölümüne bakın.

4. Adım: Kalıcı yapıları güncelleştirme

2. Adımda gerçekleştirilen doğrulama sırasında tutarsızlık bulunmadıysa, yükseltme işleminiz tamamlanır ve bu adımı atlayabilirsiniz. 2. Adım'da tutarsızlıklar bulunduysa, tutarsızlıkları veritabanından kaldırmak için ek eylemler gerekir. Gerekli eylemler, etkilenen yapı türüne bağlıdır.

Önemli

Bu adımda onarım eylemlerini yalnızca veritabanı uyumluluk düzeyi 130 olarak değiştirildikten sonra gerçekleştirin.

Veritabanınızı (veya veritabanlarını) yedekleme

Aşağıdaki bölümde açıklanan eylemlerden herhangi birini gerçekleştirmeden önce tam veritabanı yedeklemesi yapmanızı öneririz. Azure SQL Veritabanı kullanıyorsanız, kendiniz yedeklemeniz gerekmez; güncelleştirmelerden herhangi birinde bir sorun olması durumunda zaman içinde geri dönmek için her zaman belirli bir noktaya geri yükleme işlevini kullanabilirsiniz.

CHECK kısıtlamaları

Kısıtlama ihlallerinin düzeltilmesi CHECK için tablodaki verilerin veya kısıtlamanın CHECK kendisinin değiştirilmesi gerekir.

Kısıtlamanın adından (2. Adımda elde edilen) kısıtlama tanımını aşağıdaki gibi alabilirsiniz:

SELECT definition FROM sys.check_constraints

WHERE object_id= OBJECT_ID(N'constraint_name')

Etkilenen tablo satırlarını incelemek için, deyimi tarafından DBCC CHECKCONSTRAINTS daha önce döndürülen Where bilgilerini kullanabilirsiniz:

SELECT *

FROM [schema_name].[table_name]

WHERE Where_clause

Kısıtlamanın ihlal olmadığından emin olmak için etkilenen satırları güncelleştirmeniz veya kısıtlama tanımını değiştirmeniz gerekir.

Tablo verilerini güncelleştirme

Verilerin nasıl güncelleştirilmesi gerektiğini belirten kesin bir kural yoktur. Genel olarak, tarafından DBCC CHECKCONSTRAINTSdöndürülen her farklı Where deyimi için aşağıdaki güncelleştirme deyimini çalıştırırsınız:

UPDATE [schema_name].[table_name] SET new_column_values

WHERE Where_clause

Uyumluluk düzeyi 130'da kısıtlamayı ihlal eden bir kısıtlama ve satır içeren aşağıdaki örnek tabloyu göz önünde bulundurun:

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=120
GO
CREATE TABLE dbo.table1
(
c2 datetime,
c3 datetime,
c4 int,
CONSTRAINT chk1 CHECK (c4= (DATEDIFF (ms, c2, c3)))
)
GO
INSERT dbo.table1 (c2, c3, c4) VALUES
(convert(datetime, '1900-01-01 00:00:00.997'),
convert(datetime, '1900-01-01 00:00:01'), 3)
GO

Bu örnekte kısıtlama basittir. Sütunc4, ve c3içeren c2 bir ifadeye eşit olmalıdır. Tabloyu güncelleştirmek için bu değeri öğesine atayın c4:

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130
GO
UPDATE dbo.table1 SET c4 = datediff (ms, c2,c3)
WHERE [c2] = '1900-01-01 00:00:00.997' AND [c3] = '1900-01-01 00:00:01.000' AND [c4] = '3'
GO

WHERE update deyiminde kullanılan yan tümcesinin tarafından DBCC CHECKCONSTRAINTSdöndürülen Where bilgilerine karşılık olduğuna dikkat edin.

CHECK kısıtlaması güncelleştiriliyor

Bir CHECK kısıtlamayı değiştirmek için bırakmanız ve yeniden oluşturmanız gerekir. Güncelleştirilmiş kısıtlama tanımıyla ilgili herhangi bir sorun olması durumunda her ikisini de aynı işlemde yapmanızı öneririz. Aşağıdaki Transact-SQL'i kullanabilirsiniz:

BEGIN TRANSACTION

ALTER TABLE [schema_name].[table_name]

DROP CONSTRAINT [constraint_name]

ALTER TABLE [schema_name].[table_name]

ADD CONSTRAINT [constraint_name]

CHECK (new_constraint_definition)

COMMIT

GO

The following example updates the constraint chk1 in dbo.table1:

BEGIN TRANSACTION

ALTER TABLE dbo.table1

DROP CONSTRAINT chk1

ALTER TABLE dbo.table1

ADD CONSTRAINT chk1

CHECK (c4 <= DATEDIFF (ms, c2, c3))

COMMIT

GO

Kalıcı hesaplanan sütunlar

Kalıcı hesaplanan sütunları güncelleştirmenin en kolay yolu, hesaplanan sütun tarafından başvuruda bulunan sütunlardan birini güncelleştirmektir. Sütunun yeni değeri eski değerle aynı olabilir, böylece işlem herhangi bir kullanıcı verisini değiştirmez.

2. Adımda not ettiğiniz hesaplanan sütunlardaki tutarsızlıklarla ilgili her object_id şey için bu adımları izleyin.

  1. Hesaplanan sütunları tanımlama:

    • Belirtilen için tablo adını ve kalıcı hesaplanan sütunların adlarını almak için aşağıdaki sorguyu object_idçalıştırın:

      SELECT QUOTENAME(s.name) + N'.' + QUOTENAME(t.name) AS 'table',
      QUOTENAME(c1.name) AS 'persisted computed column',
      c1.column_id AS 'computed_column_id' ,
      definition AS 'computed_column_definition'
      FROM sys.tables t
      JOIN sys.computed_columns c1 ON t.object_id=c1.object_id
      AND c1.is_persisted=1
      JOIN sys.schemas s ON t.schema_id=s.schema_id
      WHERE t.object_id=object_id
      
  2. Başvurulan sütunları tanımlama:

  • Hesaplanan sütun tarafından başvuruda bulunan sütunları tanımlamak için aşağıdaki sorguyu çalıştırın. Başvuruda bulunılan sütun adlarından birini not edin:

    SELECT QUOTENAME(s.name) + N'.' + QUOTENAME(o.name) AS 'referencing object',
    o.type_desc AS 'object type', referenced_minor_id AS 'referenced_column_id', c.name AS 'referenced_column_name'
    FROM sys.sql_expression_dependencies sed
    JOIN sys.computed_columns c1 ON sed.referencing_id=c1.object_id AND sed.referencing_minor_id=c1.column_id
    JOIN sys.objects o ON sed.referencing_id=o.object_id
    JOIN sys.schemas s ON o.schema_id=s.schema_id
    JOIN sys.columns c ON o.object_id=c.object_id AND sed.referenced_minor_id=c.column_id
    WHERE referencing_class=1 AND referenced_class=1 AND referencing_id=object_id AND referencing_minor_id=computed_column_id
    
  1. UPDATE Hesaplanan sütunun güncelleştirmesini tetikleme amacıyla başvuruda bulunan sütunlardan birini içeren bir deyim çalıştırın:

    • Aşağıdaki deyim, hesaplanan sütun tarafından başvuruda bulunan sütunun güncelleştirmesini ve ayrıca hesaplanan sütunun güncelleştirmesini tetikler.

      UPDATE [schema_name].[table_name]
      SET referenced_column_name=ISNULL(referenced_column_name, referenced_column_name)
      
    • ISNULL deyimindeki ifade, özgün sütunun değeri değiştirilmeyecek şekilde oluşturulur ve yine de hesaplanan sütunun VERITABANı uyumluluk düzeyi 130 ifade değerlendirme mantığı kullanılarak güncelleştirildiğinden emin olur.

    • Çok büyük tablolar için tek bir işlemdeki tüm satırları güncelleştirmek istemeyebilirsiniz. Böyle bir durumda, güncelleştirme deyimine bir satır aralığını tanımlayan bir WHERE yan tümce ekleyerek, örneğin birincil anahtarı temel alarak güncelleştirmeyi toplu olarak çalıştırabilirsiniz.

  2. Hesaplanan sütuna başvuran dizinleri tanımlayın.

    SELECT i.name AS [index name]
    FROM sys.index_columns ic JOIN sys.indexes i ON ic.object_id=i.object_id AND ic.index_id=i.index_id
    WHERE i.object_id=object_id AND ic.column_id=computed_column_id
    

Bu sorgu, kalıcı hesaplanan sütuna başvuran tüm dizinleri tanımlar. Bu tür dizinlerin yeniden oluşturulması gerekir. Bunu yapmak için aşağıdaki bölümdeki adımları izleyin.

Dizinler, filtrelenmiş dizinler ve dizinlenmiş görünümler

Dizinlerdeki tutarsızlıklar, Adım 2'deki çıktıda 8951 ve 8952 (tablolar için) veya 8907 ve 8908 (görünümler için) DBCC CHECK hatalarına karşılık gelir.

Bu tutarsızlıkları onarmak için ile REPAIR_REBUILDkomutunu çalıştırınDBCC CHECKTABLE. Bu, dizin yapılarını veri kaybı olmadan onaracaktır. Ancak, veritabanı tek kullanıcı modunda olmalıdır ve bu nedenle onarım sırasında diğer kullanıcılar tarafından kullanılamaz.

Ayrıca etkilenen dizinleri el ile yeniden oluşturabilirsiniz. Dizin yeniden oluşturma bir ÇEVRİmİÇİ işlem olarak (DESTEKLENEN SQL Server sürümlerinde) gerçekleştirilebildiğinden, iş yükü çevrimdışına alınamıyorsa bu seçenek kullanılmalıdır.

Dizinleri yeniden oluşturma

Veritabanını tek kullanıcı modunda ayarlamak bir seçenek değilse, 2. Adımda tanımlanan her dizin için kullanarak ALTER INDEX REBUILDdizinleri tek tek yeniden oluşturabilirsiniz.

Verilen object_id ve index_idiçin tablo ve dizin adlarını almak için aşağıdaki sorguyu kullanın.

SELECT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'table', i.name AS 'index_name'

FROM sys.objects o JOIN sys.indexes i ON o.object_id=i.object_id

WHERE o.object_id = object_id AND i.index_id = index_id

Dizini yeniden oluşturmak için aşağıdaki deyimi kullanın:

ALTER INDEX index_name ON [schema_name].[table_name] REBUILD WITH (ONLINE=ON)

Not

Standart, Web veya Express sürümleri kullanıyorsanız çevrimiçi dizin derlemesi desteklenmez. Bu nedenle, seçeneği WITH (ONLINE=ON) deyiminden ALTER INDEX kaldırılmalıdır.

Aşağıdaki örnekte filtrelenmiş dizinin yeniden oluşturulması gösterilmektedir:

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=120
GO
CREATE TABLE dbo.table2
(
    c2 datetime,
    c3 float
)
GO
INSERT dbo.table2 (c2,c3) VALUES ('1899-12-31 23:58:00.470', -0.00138344907407406)
GO
CREATE INDEX ix_1 ON dbo.table2(c2)
WHERE (c2=-0.00138344907407406)
GO
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130GOALTER INDEX ix_1 ON [dbo].[table2] REBUILD WITH (ONLINE=ON)
GO

Düzenli bakım planlarınız varsa, zamanlanmış bakımınızın bir parçası olarak bu dizin yeniden derlemesini eklemenizi öneririz.

DBCC kullanarak onarma

2. Adımda not ettiğiniz tutarsızlıkları olan bir dizinle ilgili her (object_id) için onarımı gerçekleştirmek için aşağıdaki betiği çalıştırın. Bu betik, veritabanını onarım işlemi için tek kullanıcılı modda ayarlar. En kötü durumda, onarım tam bir dizin yeniden oluşturma işlemi gerçekleştirir.

USE [database_name]

GO

ALTER DATABASE CURRENT SET SINGLE_USER WITH ROLLBACK IMMEDIATE

GO

DBCC CHECKTABLE (object_id, REPAIR_REBUILD) WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS

GO

ALTER DATABASE CURRENT SET MULTI_USER

GO

Ek C: Aday tablolarını tanımlamak için sorgular

Aşağıdaki betikler, uyumluluk düzeyi 130'daki iyileştirmelerden etkilenen veri türlerini kullanan kalıcı yapıların ve kısıtlamaların varlığına bağlı olarak kullanarak doğrulamak DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKSisteyebileceğiniz aday tabloları tanımlar.

Aşağıdaki sorgu kümesi, tablolar ve ek doğrulama gerektiren olası etkilenen yapılar hakkındaki ayrıntıları listeler.

Dizine alınan görünümler

Aşağıdaki sorgu, etkilenen veri türlerini veya etkilenen yerleşik işlevlerden herhangi birini kullanarak sütunlara başvuran tüm dizinlenmiş görünümleri döndürür:

SELECT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'view', QUOTENAME(i.name) AS 'index',QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'referenced table', QUOTENAME(c.name) AS 'referenced column', t.name AS 'data type',

-- if the data type is numeric, integer, or money, the only cases that warrent additional checks

-- with DBCC is if the view definition contains a float or datetime value, or a conversion to such value

s.definition

FROM sys.sql_expression_dependencies sed

JOIN sys.objects o ON sed.referencing_id = o.object_id AND o.type=N'V'

JOIN sys.indexes i ON o.object_id=i.object_id

JOIN sys.sql_modules s ON s.object_id=o.object_id

JOIN sys.columns c ON sed.referenced_id=c.object_id AND sed.referenced_minor_id=c.column_idJOIN sys.types t ON c.system_type_id=t.system_type_id

WHERE referencing_class=1 AND referenced_class=1 AND (c.system_type_id IN

( 59 --real

, 62 --float

, 58 --smalldatetime

, 61 --datetime

, 60 --money

, 122 --smallmoney

, 106 --decimal

, 108 --numeric

, 56 --int

, 48 --tinyint

, 52 -- smallint

, 41 --time

, 127 --bigint

) OR s.[definition] LIKE '%DATEDIFF%'

OR s.[definition] LIKE '%CONVERT%'

OR s.[definition] LIKE '%CAST%'

OR s.[definition] LIKE '%DATEPART%'

OR s.[definition] LIKE '%DEGREES%')

Kalıcı hesaplanan sütunlar

Aşağıdaki sorgu, etkilenen veri türlerini kullanarak veya bir dizinden sütunun kalıcı olduğu veya başvurulduğu etkilenen yerleşik işlevlerden herhangi birini kullanarak diğer sütunlara başvuran hesaplanan sütunlara sahip tüm tabloları döndürür.

SELECT QUOTENAME(sed.referenced_schema_name) + N'.' +

QUOTENAME(sed.referenced_entity_name) AS 'candidate table with computed column',

QUOTENAME(c1.name) AS 'computed column', c1.is_persisted,QUOTENAME(c2.name) AS 'referenced column', t.name AS 'data type',

-- if the data type is numeric, integer, or money, the only cases that warrent additional checks

-- with DBCC is if the column definition contains a float or datetime value, or a conversion to such value

c1.definition

FROM sys.sql_expression_dependencies sed

JOIN sys.computed_columns c1 ON sed.referencing_id=c1.object_id AND sed.referencing_minor_id=c1.column_id

JOIN sys.columns c2 ON sed.referenced_id=c2.object_id AND sed.referenced_minor_id=c2.column_id

JOIN sys.types t ON c2.system_type_id=t.system_type_idWHERE referencing_class=1 AND referenced_class=1

AND (c2.system_type_id IN

( 59 --real

, 62 --float

, 58 --smalldatetime

, 61 --datetime

, 60 --money

, 122 --smallmoney

, 106 --decimal

, 108 --numeric

, 56 --int

, 48 --tinyint

, 52 -- smallint

, 41 --time

, 127 --bigint

) OR c1.[definition] LIKE '%DATEDIFF%'

OR c1.[definition] LIKE '%CONVERT%'

OR c1.[definition] LIKE '%DATEPART%'

OR c1.[definition] LIKE '%DEGREES%')

AND (

-- the column is persisted

c1.is_persisted=1

-- OR the column is included in an index

OR EXISTS (SELECT 1 FROM sys.index_columns ic WHERE ic.object_id=c1.object_id AND ic.column_id=c1.column_id)

)

Filtrelenmiş dizinler

Aşağıdaki sorgu, etkilenen veri türlerine sahip filtre koşulundaki sütunlara başvuran filtrelenmiş dizinlere sahip tüm tabloları döndürür:

SELECT QUOTENAME(sed.referenced_schema_name) + N'.' +

QUOTENAME(sed.referenced_entity_name) AS 'candidate table with filtered index',

QUOTENAME(i.name) AS 'referencing index',

QUOTENAME(c.name) AS 'referenced column',

t.name AS 'data type',

-- if the data type is numeric, integer, or money, the only cases that warrent additional checks

-- with DBCC is where the filter condition contains a float or datetime value

i.filter_definition AS 'filter condition'

FROM sys.sql_expression_dependencies sed

JOIN sys.indexes i ON sed.referencing_id=i.object_id AND sed.referencing_minor_id=i.index_id

JOIN sys.columns c ON sed.referenced_id=c.object_id AND sed.referenced_minor_id=c.column_id

JOIN sys.types t ON c.system_type_id=t.system_type_id

WHERE referencing_class=7 AND referenced_class=1 AND i.has_filter=1

AND c.system_type_id IN ( 59 --real

, 62 --float

, 58 --smalldatetime

, 61 --datetime

, 60 --money

, 122 --smallmoney

, 106 --decimal

, 108 --numeric

, 56 --int

, 48 --tinyint

, 52 -- smallint

, 41 --time

, 127 --bigint

)

Kısıtlamaları denetleme

Aşağıdaki sorgu, etkilenen veri türlerine veya yerleşik işlevlere başvuran denetim kısıtlamaları olan tüm tabloları listeler:

SELECT QUOTENAME(sed.referenced_schema_name) + N'.' +

QUOTENAME(sed.referenced_entity_name) AS 'candidate table with check constraint',

QUOTENAME(c.name) AS 'constraint_name', c.definition AS 'constraint_definition',

QUOTENAME(col.name) AS 'referenced column', t.name AS 'data type'

FROM sys.sql_expression_dependencies sed

JOIN sys.check_constraints c ON sed.referencing_id=c.object_id AND sed.referencing_class=1

JOIN sys.columns col ON sed.referenced_id=col.object_id AND sed.referenced_minor_id=col.column_id

JOIN sys.types t ON col.system_type_id=t.system_type_id

WHERE referencing_class=1 AND referenced_class=1 AND (col.system_type_id IN

( 59 --real

, 62 --float

, 58 --smalldatetime

, 61 --datetime

, 60 --money

, 122 --smallmoney

, 106 --decimal

, 108 --numeric

, 56 --int

, 48 --tinyint

, 52 -- smallint

, 41 --time

, 127 --bigint)

OR c.[definition] LIKE '%DATEDIFF%'

OR c.[definition] LIKE '%CONVERT%'

OR c.[definition] LIKE '%DATEPART%'

OR c.[definition] LIKE '%DEGREES%')

Ek D: CHECK* deyimleri oluşturmak için betik

Aşağıdaki betik, önceki ekteki sorguları birleştirir ve ve CHECKTABLE deyimleri biçiminde CHECKCONSTRAINTS tabloların ve görünümlerin listesini sunarak sonuçları basitleştirir.

DECLARE @CRLF nvarchar(10) = CHAR(13) + CHAR(10);
DECLARE @sql nvarchar(max) = N'DBCC TRACEON(139,-1); ' + @CRLF ;

SELECT @sql += N'DBCC CHECKTABLE (N''' + object_for_checktable + N''') WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS; ' + @CRLF
FROM
(

--indexed views
SELECT DISTINCT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'object_for_checktable'
FROM sys.sql_expression_dependencies AS sed
 INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id AND o.type = N'V'
 INNER JOIN sys.indexes AS i ON o.object_id = i.object_id
 INNER JOIN sys.sql_modules AS s ON s.object_id = o.object_id
 INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id
 INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id

WHERE referencing_class = 1 AND referenced_class=1 
 AND (c.system_type_id IN 
( 59 --real
 , 62 --float
 , 58 --smalldatetime
 , 61 --datetime
 , 60 --money
 , 122 --smallmoney
 , 106 --decimal
 , 108 --numeric
 , 56 --int
 , 48 --tinyint
 , 52 -- smallint
 , 41 --time
 , 127 --bigint
) OR s.[definition] LIKE N'%DATEDIFF%'
 OR s.[definition] LIKE N'%CONVERT%'
 OR s.[definition] LIKE N'%CAST%'
 OR s.[definition] LIKE N'%DATEPART%'
 OR s.[definition] LIKE N'%DEGREES%')

UNION

--persisted computed columns
SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable'
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.computed_columns AS c1 ON sed.referencing_id = c1.object_id AND sed.referencing_minor_id = c1.column_id
INNER JOIN sys.columns AS c2 ON sed.referenced_id=c2.object_id AND sed.referenced_minor_id = c2.column_id
INNER JOIN sys.types AS t ON c2.system_type_id = t.system_type_id
WHERE referencing_class = 1 AND referenced_class = 1 
 AND (c2.system_type_id IN
( 59 --real
 , 62 --float
 , 58 --smalldatetime
 , 61 --datetime
 , 60 --money
 , 122 --smallmoney
 , 106 --decimal
 , 108 --numeric
 , 56 --int
 , 48 --tinyint
 , 52 -- smallint
 , 41 --time
 , 127 --bigint
) OR c1.[definition] LIKE N'%DATEDIFF%'
 OR c1.[definition] LIKE N'%CONVERT%'
 OR c1.[definition] LIKE N'%DATEPART%'
 OR c1.[definition] LIKE N'%DEGREES%')
AND (
-- the column is persisted
c1.is_persisted = 1 
-- OR the column is included in an index
OR EXISTS (SELECT 1 FROM sys.index_columns AS ic 
WHERE ic.object_id = c1.object_id AND ic.column_id=c1.column_id)
)

UNION

--indexed views
SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable'
FROM sys.sql_expression_dependencies AS sed 
INNER JOIN sys.indexes AS i ON sed.referencing_id = i.object_id AND sed.referencing_minor_id = i.index_id
INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id 
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id
WHERE referencing_class = 7 AND referenced_class = 1 AND i.has_filter = 1
AND c.system_type_id IN ( 
 59 --real
 , 62 --float
 , 58 --smalldatetime
 , 61 --datetime
 , 60 --money
 , 122 --smallmoney
 , 106 --decimal
 , 108 --numeric
 , 56 --int
 , 48 --tinyint
 , 52 -- smallint
 , 41 --time
 , 127 --bigint
)) AS a

SELECT @sql += N'DBCC CHECKCONSTRAINTS (N''' + object_for_checkconstraints + N'''); ' + @CRLF
FROM
(

SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checkconstraints'
FROM sys.sql_expression_dependencies AS sed 
INNER JOIN sys.check_constraints AS c ON sed.referencing_id = c.object_id AND sed.referencing_class = 1
INNER JOIN sys.columns AS col ON sed.referenced_id = col.object_id AND sed.referenced_minor_id = col.column_id
INNER JOIN sys.types AS t ON col.system_type_id = t.system_type_id
WHERE referencing_class = 1 AND referenced_class = 1 AND (col.system_type_id IN 
( 59 --real
 , 62 --float
 , 58 --smalldatetime
 , 61 --datetime
 , 60 --money
 , 122 --smallmoney
 , 106 --decimal
 , 108 --numeric
 , 56 --int
 , 48 --tinyint
 , 52 -- smallint
 , 41 --time
 , 127 --bigint
) OR c.[definition] LIKE N'%DATEDIFF%'
 OR c.[definition] LIKE N'%CONVERT%'
 OR c.[definition] LIKE N'%DATEPART%'
 OR c.[definition] LIKE N'%DEGREES%')
) a

SET @sql += N'DBCC TRACEOFF(139,-1);';

PRINT @sql;

--to run the script immediately, use the following command:
--EXECUTE sp_executesql @sql;
GO