2016-08-02 2 views
1

여러 절에서 hashbytes를 사용하여 해시 키를 만들면 where 절에서 지금 사용중인 성능을 얻을 수 있습니다.datetime2 필드가있는 HashBytes

alter table dbo.Table1 
add HashKey AS CAST(hashbytes('MD5', PID+PNumber+CONVERT([varchar] (50),[DateStamp]) +CONVERT(VARCHAR(50), TransactionCount)+OCD+ONbr+TransactionID) AS VARBINARY(80)) PERSISTED 

하지만 그 중 하나의 열은 내가 추가 할 수없는 datetime2 필드입니다. 내가 아래에 오류 메시지가 나타납니다 노력하고있는 동안

"계산 된 열 'table1'열 'HashKey'열이 비 결정적이기 때문에 유지할 수 없습니다."

제 연구에서 비 결정적이므로 datetime2를 사용할 수 없습니다.

그러나 모든 밀리 초를 포함하는 값을 정확하게 비교해야하므로 형식을 변경할 수 없습니다.

누구든지 나를 해결할 수 있습니까?. 다른 해결책은 인정 될 것입니다.

+0

나는 결정형이 아닌 데이터 유형에 대해 들어 본 적이 없다. 당신이하고있는 일이 체크섬 기능과 거의 같다고 보입니다. https://msdn.microsoft.com/en-us/library/ms189788.aspx –

+0

표현 목록에있는 값 중 하나가 변경되면 목록의 체크섬 또한 일반적으로 변경됩니다. 그러나 체크섬이 변경되지는 않을 가능성이 있습니다. 따라서 응용 프로그램에서 변경 사항을 누락하지 않는 한 CHECKSUM을 사용하여 값이 변경되었는지 여부를 감지하는 것을 권장하지 않습니다. 우리는 이것을 용납하지 않는다 :) –

답변

0

나는 의미의 모르겠습니다 ..

그러나 진에 날짜를 캐스팅 항상 예를 ​​들어 아래 새로운 value.see를 제공합니다 ..

select getdate(),cast(getdate()as binary) 

2016-08-02 10:17:20.573 0x000000000000000000000000000000000000000000000000A65600A98EEC 


2016-08-02 10:17:40.537 0x000000000000000000000000000000000000000000000000A65600A9A651 

지금처럼 시도 ..

select hashbytes('md5',cast(getdate()as binary)) 
+0

나는 ur suggesion에서 따르는 것처럼했다. (VARCHAR (50), TransactionCount) + OCD + ONbr (HashKey ('MD5'), PID + PNumber + CONVERT (VARCHAR (50), 캐스팅 (바이너리로 날짜 저장)) + + TransactionID) AS VARBINARY (80)) PERSISTED' 이제 작동 중입니다. Thx –

+0

사실 해시 바이트 생성 값에 대한 C# Equivalent 값을 얻으려면 지금 문제에 직면하고 있습니다. 우리는 datestamp를 binary로 변환 한 다음 varchar로 변환했습니다. 이제 같은 C# 값을 얻을 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 여기에 다른 질문으로 게시했습니다 http://stackoverflow.com/questions/38739141/convert-sql-hash-bytes-binary-value-multiple-datatype-fields-combination-to-c –

+1

이유는 'BINARY'로 캐스팅되었지만 'VARCHAR'은 문자열에 대한 datetime에서 CAST가 _locale_에 특정하기 때문입니다. 따라서 비결정주의 경고; 누구든지 언제든지 Windows 또는 SQL Server의 로케일을 변경할 수 있습니다. 표준화 된 ISO-8601 포맷 문자열을 얻기 위해'CONVERT (VARCHAR (100), datestamp, 126) '을 사용하고, C# 어플리케이션에서 같은 작업을 수행하면 해시가 일치해야합니다. 동일한 인코딩). – rmalayter