복붙노트

[SQL] 나는 SQL_VARIANT 데이터 유형을 사용해야합니까?

SQL

나는 SQL_VARIANT 데이터 유형을 사용해야합니까?

SP4와 SQL 서버 2005를 사용하고 난 데이터베이스 테이블을 설계하고있다.

다음 표는 DDL

CREATE TABLE CPSync4D.ProjectProfilerOption
(
    ProjectProfilerOptionID     INT  IDENTITY(1,1) CONSTRAINT PK_ProjectProfilerOption_ProjectProfilerOptionID PRIMARY KEY 
   ,ProjectID                   INT  CONSTRAINT FK_ProjectProfilerOption_Project_ProjectID FOREIGN KEY(ProjectID) REFERENCES CPSync4D.Project(ProjectID) ON DELETE CASCADE
   ,ProfilerOptionID            TINYINT CONSTRAINT FK_ProjectProfilerOption_ProfilerOption_ProfilerOptionID  FOREIGN KEY(ProfilerOptionID) REFERENCES CPSync4D.ProfilerOption (ProfilerOptionID) 
   ,ProfilerOptionValue         sql_variant  NOT NULL   

)
Go

profileroptionvalue 열은 30 자, 정수 또는 소수 값, 예를 들어 개까지 문자열 중 하나를 저장할 수 값 "ProfilerValueType"또는 12.52 또는 20 등 (더 적은 (100)보다 두 소수보다보다 값 및 정수)이다

나는 사용해야 SQL_VARIANT 또는 VARCHAR (30) ...? 나는 결코 전에 SQL_VARIANT을 사용하지 않고 데이터베이스 설계의 관점에서 사용하지 않는하지 않도록 어떤 의미.

.NET 코드와의 sql_variant를 사용하는 모든 함정 ...

해결법

  1. ==============================

    1.10 가지 이유는 명시 적으로 SQL Server 데이터 형식을 변환하는

    10 가지 이유는 명시 적으로 SQL Server 데이터 형식을 변환하는

    하지만 마음에 이러한 제한 및 성능에 미치는 영향과 함께, 내가 먼저 대안을 볼 것 전에 내가 SQL_VARIANT를 사용하지 않았습니다.

    적어도 선호하는 솔루션 내 가장 일 것입니다 다음

    편집 Cudo는 ta.speot.is에의

    변형은 외부 키의 차의 일부가 될 수 있습니다

  2. ==============================

    2.내 대답은 조금 늦었 그러나 여기에서 만들어지는 테이블은 응용 프로그램 구성 테이블처럼 조금 보이는 것을 알고있다. 주어진 제안에 대한 대안으로,의 약 30 개 또는 8000 문자에 자신을 제한하지 생각해 봅시다. 의는 또한 조금 더 자기 포함 및 사용자 정의 만들어 보자.

    내 대답은 조금 늦었 그러나 여기에서 만들어지는 테이블은 응용 프로그램 구성 테이블처럼 조금 보이는 것을 알고있다. 주어진 제안에 대한 대안으로,의 약 30 개 또는 8000 문자에 자신을 제한하지 생각해 봅시다. 의는 또한 조금 더 자기 포함 및 사용자 정의 만들어 보자.

    마음에 그 생각과 이유조차 설정의 여러 수준을 허용 할 XML 데이터 유형으로 "프로필"정보 저장 하시겠습니까? 당신은 아마 더 이상 ProfilerOptionID 등의 열을 필요로하지 않을 하나 개의 간단한 제어 테이블이 다운받을 수 있습니다.

  3. ==============================

    3.그것의 가치는 암시의 sql_variant 열을 복사 할 수 없습니다 것을주의.

    그것의 가치는 암시의 sql_variant 열을 복사 할 수 없습니다 것을주의.

    예를 들면 만들기 CPSync4D.ProjectProfilerOption의 백업 스키마 CPSync4D.ProjectProfilerOption_bkp라고

    그리고

    Insert into CPSync4D.ProjectProfilerOption_bkp
    (
        ProjectProfilerOptionID
       ,ProjectID
       ,ProfilerOptionID
       ,ProfilerOptionValue 
    )
    SELECT 
        ProjectProfilerOptionID
       ,ProjectID
       ,ProfilerOptionID
       ,ProfilerOptionValue 
    FROM CPSync4D.ProjectProfilerOption 
    

    백업 테이블에 ProfilerOptionValue에 대한 모든 값은 VARCHAR 될 것입니다

    또한 참고 : 나는 SQL_VARIANT 복제에 사용할 수 없습니다 그러나 이것은 사실이 아니다는 것을 들었습니다. 난 그냥 일을했지만이 이전 버전에 대한 진정한되었을 수도 있기 때문에 물론 (난 그렇게 확신 할 수 없습니다 또는이 거부 확인 할 수있는 이전 버전이없는) (내가 사용하고 있음) SQL 2008 R2 수행 할 수 있습니다.

    사실 생각이 무엇인지, 당신이 그것을에서 SQL 변형있는 테이블을 복제하고 많은 데이터를 가지고 수행 한 후 뭔가 잘못하고 수동으로 데이터를 수정해야하는 경우, 당신은 쓰기에 SQL의 더러운 부분이있을 수 있다는 것입니다 . 데이터를 복사 할 때 동일한 복사본 문에 몇 가지 기본 유형으로 복사 할 수 있기 때문입니다. 나는 (스냅 샷의 명백한 제외하지만 사용은 bcp에) 여러 행을 복사하지 않기 때문에 복제가이 문제가없는 것 같아요.

    추신. 나는 이것이 이전 게시물을 실감하지만 같은 질문 다른 미래 방문자를 위해 여기를 넣어.

  4. from https://stackoverflow.com/questions/9039455/should-i-use-sql-variant-data-type by cc-by-sa and MIT license