2017-02-13 4 views
1

私は、代理PKと多数の重複する行を持つ1990年(はい、27年前)に作成されたテーブルを持っています。私はAccessからSQL Serverにテーブルを移行していますが、私は代理キーフィールドを削除しましたが、null値を含むことができる2つのソース列の計算カラムを含める方法を理解しようとしています。 これは私の作品:日付と数値を含む計算列は、PKの一部としてnullでもかまいません

CREATE TABLE [dbo].[ActionHistory] 
(
    [Position Number] [int] NOT NULL, 
    [SSN] [nvarchar](11) NOT NULL, 
    [Action] [nvarchar](10) NOT NULL, 

    [EffectiveSalaryKey] AS (CONVERT([varchar](20), [Action Effective Date], 20) + ';' + 
           CONVERT([varchar](20), isnull([Salary], ''), 0)) PERSISTED NOT NULL, 
    [Action Effective Date] [datetime] NULL, 
    [Salary] [money] NULL, 
    ..., 
    [entered] [datetime] NULL 
     CONSTRAINT [DF_ActionHistory_entered] DEFAULT (getdate()), 

    CONSTRAINT [PK_ActionHistory] 
     PRIMARY KEY CLUSTERED ([Position Number] ASC, [SSN] ASC, [Action] ASC, [EffectiveSalaryKey] ASC) 
    ... 
) 

それは私がnullの有効日付を持つ行を入力することはできません。

キーフィールドの空白に変換するか、1/1/1900 00:00:00のような静的な値を変換するようなことをしたいのですが、構文を正しく取得できません。

私はvarcharへの変換前、変換後、および区切り文字を付加した後isnull(date,'')を追加しようとしましたが、彼らは動作しませんでした、と私はまたisnull(date,'1900-01-01 00:00:00')を追加しようとしたが、それはどちらか動作しませんでした。

私は試してみてください。

[EffectiveSalaryKey] AS 
    (
     CONVERT(
      [varchar](20),isnull([Action Effective Date],''),20 
       ) 

それは言う:

Computed column 'EffectiveSalaryKey' in table 'ActionHistory' cannot be persisted because the column is non-deterministic. 

私はバグが割り当てのこのタイプのためにそこにあります理解し、私は、GUIの外に、スクリプトでこれをやっています。また、日付をvarcharに変換するときにスタイルを指定する必要があることも理解しています。

これらのフィールド値をどのように追加して計算された列をPKの一部として使用するか教えてください。

おかげで、

-Beth

+1

あなたはプレーンテキストでSSNの保存を停止する必要があります。それは信じられないほど無責任なだけでなく、多くの州で違法です。そして、あなたがその州でビジネスをしなくてもこの種の情報が侵害された場合には、責任を負うことができる法的判例があります。マサチューセッツ州はそのような州の一つです。 SSNは塩漬けされハッシュされる必要があります。常に暗号化する必要があります。 –

+0

実際には、私はこのデータを使ってすべきことがたくさんありますが、今はRIを適用している別のバックエンドに移すことに焦点を当てています。 – Beth

+0

プライマリキーの一部としてクリアテキストでSSNを使用するのはひどいです。私のデータがこのシステムの近くにないことを願っています。私はあなたのビジネスに苦痛を感じています。しかし、真剣に、この問題に悩まされています。このタイプのデータを維持することは、ある時点でそれが欠点を抱えているために修正されなければならない仕事です修復。企業が多くの法律上の理由により危険にさらされているため、そのデータを暗号化することが優先事項です。私はこれを旗竿の上に送り、彼らが弁護士と話すことを提案する。冗談ではありません。これは深刻です。 –

答えて

1

私もこのテーブルに代理キーを使用することをお勧めし、一意のインデックスを補完するでしょう。あなたは何が好きに最初isnullの最初の''を変更することができ

, effectivesalarykey as (
     isnull(convert(varchar(20),[action_effective_date],20)+ ';','') 
     + isnull(convert(varchar(20),salary),'0') 
    ) persisted not null 

:あなたの計算列の場合

(アンダースコアで列名にスペースを置き換えると一緒に)、私は、これはあなたが後にあるかだと思います

, effectivesalarykey as (
     isnull(convert(varchar(20),[action_effective_date],20)+ ';','1900-01-01 00:00:00;') 
     + isnull(convert(varchar(20),salary),'0') 
    ) persisted not null 

rextester:http://rextester.com/SBA4540

create table dbo.actionhistory(
    id int not null identity(1,1) 
    , position_number int not null 
    , ssn nvarchar(11) not null 
    , action nvarchar(10) not null 
    , effectivesalarykey as (
     isnull(convert(varchar(20),[action_effective_date],20)+ ';','') 
     + isnull(convert(varchar(20),salary),'0') 
    ) persisted not null 
    , 
    [action_effective_date] datetime null 
    , salary money null 
    , entered datetime null constraint df_actionhistory_entered default (getdate()) 
    , constraint pk_actionhistory primary key clustered (id) 
); 

create unique nonclustered index ix_actionhistory_position_ssn_action_effectivesalarykey 
    on dbo.actionhistory (
     position_number asc 
    , ssn asc 
    , action asc 
    , effectivesalarykey asc) 


insert into dbo.actionhistory (position_number,ssn,action) values 
(1,'000-00-0000','Test') 

select * 
from dbo.actionhistory; 

結果は:あなたが何かを行う前に

+----+-----------------+-------------+--------+--------------------+-----------------------+--------+---------------------+ 
| id | position_number |  ssn  | action | effectivesalarykey | action_effective_date | salary |  entered  | 
+----+-----------------+-------------+--------+--------------------+-----------------------+--------+---------------------+ 
| 1 |    1 | 000-00-0000 | Test |     0 | NULL     | NULL | 13.02.2017 20:35:21 | 
+----+-----------------+-------------+--------+--------------------+-----------------------+--------+---------------------+ 
+1

私はそれを試したことを誓っていますが、GUI内にあると思います。その考えは、フィールドだけを残して、クエリ、フォーム、レポートの下流の依存関係を壊さないようにすることでした。今のところ、私はそれについて心配していません。私はマイグレーションするのに悪い問題を持つ別のテーブルを持っています。あなたの助けをありがとう、それは今働いている。 – Beth

+0

@Bethお手伝いします! – SqlZim

関連する問題