2009-02-04 3 views
1

.NET TimeSpan 개체의 문자열 표현을 저장하는 데 사용되는 SQL Server 2005 테이블에 nvarchar (max) 열이 있습니다. 때때로 테이블이 수동으로 편집됩니다. 체크 제약을 추가하여 문자열이 TimeSpan.Parse()에 의해 구문 분석 될 수 있는지 확인합니다. 어떻게해야합니까? 내가 SQL Server에서 정규식을 활성화하는 방법 중 하나를 사용할 수있을 것 같아요,하지만 하나 있다면 더 쉬운 방법을 찾고 싶습니다!.NET TimeSpan에 대한 T-SQL 점검 제한 조건은 무엇입니까?

답변

6

.Net Timespans는 TimeSpan의 .Ticks 속성을 사용하여 int 열에 저장하는 것이 더 좋습니다.

물론 수동으로 테이블을 편집 할 필요가 없습니다. 그러나 수동 테이블 편집은 어쨌든 악합니다. TimeSpan.Parse()가 작동하는지 또는 유효한 값을 가지고 있는지 확인하는 가장 좋은 방법은 해당 함수를 사용하여 편집을 수행하는 클라이언트 응용 프로그램을 제공하는 것입니다.

마지막으로 이렇게해야 할 경우 TimeSpan.Parse()를 사용하여 테스트하는 clr 사용자 정의 함수를 빌드 해보십시오. 그런 다음 제약 조건에 해당 함수를 포함 할 수 있는지 확인하십시오 (특히 udf (clr udf의 경우)가 허용되는 경우).

+0

너무 환경에 의존 .Ticks 아닌가요? 밀리 초를 저장하는 것이 더 좋을 것이라고 생각합니다. –

+1

TimeSpan tick은 100 나노초로 정의됩니다. 환경 의존적이지 않습니다. (분명히있는 프로세서 사이클과는 달리). –

+0

'TimeSpan.MaxValue.Ticks'은 9223372036854775807을 산출합니다.'TimeSpan.MinValue.Ticks'는 -9223372036854775808을 산출합니다. 'TimeSpan.Ticks' 값을 적절하게 저장하려면 반드시 bigint를 사용해야합니다. – JamieSee

1

나는 가능한 한 직접적인 테이블 편집을 제거하려고 노력해야한다는 것을 Joel에게 동의합니다. 또한 데이터베이스를 프런트 엔드 코드와 너무 긴밀하게 연결하는 것은 대개 나쁜 생각이라고 덧붙입니다. 데이터베이스에 가장 적합한 방식으로 데이터를 저장하고 프런트 엔드 코드에 필요한대로 변환하십시오.

당신이 할 수 없다면, 아마도이 첫번째 시도는 당신을 가까이 가게 할 것입니다. ISDATE() 함수는 가장 가까운 1000 번째 초만 시간을 받아들이 기 때문에 Timespan.Parse가 수행하는 전체 정밀도는 허용되지 않습니다. 어쩌면 당신은 그것에 구축 할 수 있습니다. 내가 일을하면서 두 번째 분수를 제거하고 별도로 확인하십시오. 그것은 표현의 곰입니다.

CREATE TABLE dbo.Test_Timespan 
(
    my_string NVARCHAR(MAX) NOT NULL, 
    CONSTRAINT CK_Test_Timespan_my_string CHECK (CAST(SUBSTRING(RTRIM(LTRIM(my_string)), 1, CHARINDEX('.', RTRIM(LTRIM(my_string))) - 1) AS INT) BETWEEN -10675199 AND 10675199 AND ISDATE(SUBSTRING(RTRIM(LTRIM(my_string)), CHARINDEX('.', RTRIM(LTRIM(my_string))) + 1, LEN(my_string) - CHARINDEX('.', RTRIM(LTRIM(my_string))))) = 1) 
) 
0

TimeSpan 값을 SQL에 저장하는 두 가지 방법이 있습니다. bigint의 진드기로 사용하거나 varchar (26)의 문자열로 지정합니다. bigint에 100 나노초 틱으로 저장되어 있으면 당연히 TimeSpan의 적절한 숫자 범위로 제한됩니다. 05.4775807 : 48 : 05.4775808 및 10675199.02 : 48 : (. TimeSpan.Ticks는 C#에서 long이다)

이 문자열로 저장되어있는 경우, 그 값은 -10675199.02 사이를 하강한다. 이를 검증하는 가장 간단한 방법은 진드기로 변환하는 것입니다. 변환이 성공하면 값은 양호합니다.

SQL에서 TimeSpan 조작을 수행하는 기능은 내 대답 What is the correct SQL type to store a .Net Timespan with values > 24:00:00?을 참조하십시오.

이러한 기능이 설치되면 제약 쉽게 필요에 따라 변경할 수있는 템플릿으로 다음 코드를 사용하여 만들 수 있습니다 :

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[TimeSpanStringTest](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [TimeSpanString] [varchar](26) NOT NULL 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[TimeSpanStringTest] WITH CHECK ADD CONSTRAINT [CK_TimeSpanString] CHECK (([dbo].[ConvertFromTimeSpanString]([TimeSpanString]) IS NOT NULL)) 
GO 

ALTER TABLE [dbo].[TimeSpanStringTest] CHECK CONSTRAINT [CK_TimeSpanString] 
GO 

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Validates a TimeSpan string by trying to convert it to ticks.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TimeSpanStringTest', @level2type=N'CONSTRAINT',@level2name=N'CK_TimeSpanString' 
GO