2016-10-07 46 views
5

Bir SQL Server tablosuna hesaplanmış bir sütun eklemeye çalışırken, bir DATE türünde bir sütunu doğrudan bir VARCHAR'a yayınlamanın deterministik olmayan olarak kabul edildiğini buldum. Ancak, tarihin münferit bölümlerini çıkarırsam ve bunları ayrı ayrı yaparsam, her şey yolundadır. Doğrudan DATE'den VARCHAR'a gönderilmesinin neden deterministik olamayacağına dair makul bir açıklama düşünemiyorum. Herkesin bir açıklaması var mı?Niçin DATE'den VARCHAR'a deterministik olmayan bir döküm var?

Ex.

create table [dbo].[junk_CCtest] 
(
    PatientId bigint identity not null, 
    EmployerId varchar(6) default 'F*Corp', 
    EffDate date default getdate() 
) 
go 
-- This works fine. 
alter table dbo.junk_CCtest 
    add Checksum1 as (hashbytes('sha2_256', EmployerId + '/' + cast(PatientId as varchar(10)) + cast(year(EffDate) as varchar(4)) + cast(month(EffDate) as varchar(2)) + cast(day(EffDate) as varchar(2)))) persisted; 
go 
-- This results in: "Computed column 'Checksum3' in table 'junk_CCtest' cannot be persisted because the column is non-deterministic." 
alter table dbo.junk_CCtest 
    add Checksum3 as (hashbytes('sha2_256', EmployerId + '/' + cast(PatientId as varchar(10)) + cast(EffDate as varchar(10)))) persisted; 
go 

sayesinde

Ian

+0

Ve 3 basamaklı 2. parametreyi "convert()" öğesine eklediyseniz, yine de deterministik olmaz mı? Bunun BOL'de açık bir şekilde açıklandığını düşündüm. – ajeh

cevap

6

dize (varchar) bir tarih gösterimi (İngiltere'de örneğin tarihleri ​​genellikle ABD'de daha farklı temsil edilir) "yerel" ayarlarına bağlıdır.

Yukarıdaki örneğinizde, ilk CAST() yönteminiz varcharın biçimini açıkça belirtir, ancak ikincisi veritabanını varchar sonucunun nasıl biçimlendirileceğini belirlemek için yerel ayarlarını incelemeye zorlar.

Dönüşümün, CAST() işlevinin dışındaki bir şeye bağlı olması basitliği onu deterministik kılmaz.

Başka bir deyişle, bir yerel ayar ile CAST() çalıştırırsanız, yerel ayarı değiştirin ve ardından SAME CAST() yeniden çalıştırın ve farklı bir sonuç elde edersiniz. Bu deterministik olmayan davranışların tanımıdır.

+0

Elbette, siz haklısınız. Bunu düşünmeliydim. Bu, daha iyi bir seçenek olduğunu ve bunun yerine CAST yerine CONVERT kullanmak olduğunu anlamamı sağladı. Bu çözüm, tarihin her bir parçasını ayrı ayrı yayınlamaktan daha kısa sürer. - Bu iyi çalışıyor. alter table dbo.junk_CCtest \t sağlama Checksum3 olarak (hashbytes ('sha2_256', EmployerId + '/' + cast (PatientId varchar (10)) + convert (varchar (8), EffDate, 112))); –