6

tôi đang cố gắng để tạo ra một cột tính toán tiếp tục tồn tại sử dụng biểu HỒ SƠ:Tại sao biểu thức CASE của tôi không xác định?

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date]>'20100101' THEN [Date] 
    ELSE NULL 
    END PERSISTED 

MSDN nói rõ rằng CASE là xác định, here

Tuy nhiên, tôi nhận được một lỗi:

Msg 4936, Level 16, State 1, Line 1 Computed column 'PreviousDate' in table 'Calendar' cannot be persisted because the column is non-deterministic.

Tất nhiên, tôi có thể tạo ra một UDF vô hướng và khai báo một cách rõ ràng nó như là xác định, nhưng có cách nào đơn giản hơn không? Tôi đã ở giữa nhận gói dịch vụ mới nhất. Cảm ơn.

+0

Cũ câu hỏi, tôi biết, nhưng làm thế nào để bạn đề nghị * "tạo ra một UDF vô hướng và tuyên bố một cách rõ ràng như xác định" * trong SQL Server. Tôi nói với bạn có thể làm như vậy trong Oracle, nhưng tôi chưa bao giờ nhìn thấy một cách trong SQL Server ... – jimbobmcgee

Trả lời

17

Bạn cần phải CONVERT '20100101' with a style.

Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified.

Vì vậy, hãy thử này:

...WHEN [Date] > CONVERT(datetime, '20100101', 112).... 

ngày phân tích cú pháp từ chuỗi có thể không đáng tin cậy như I've answered before (mostly in comments)

Edit:

tôi sẽ không nói rằng đó là một lỗi, nhưng SQL Server yêu cầu làm rõ 100%. yyyymmdd không phải là phân tích cú pháp ISO và SQL Server yyyy-mm-dd không đáng tin cậy (xem liên kết câu trả lời của tôi)

+0

+1 - đánh bại tôi với nó, agh! –

5

Dường như rất khó tính về các kiểu dữ liệu. Hãy thử làm điều này:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN [Date] 
    ELSE Convert(DateTime, NULL, 101) 
    END PERSISTED 
+0

Rất tiếc, tôi không thể đánh dấu cả hai câu trả lời là câu trả lời, vì vậy tôi chỉ đánh dấu câu trả lời đầu tiên và đã upvoted của bạn. Cảm ơn! –

Các vấn đề liên quan