ゴールを挿入することはできませんMERGE、UPDATE、INSERT T-SQLの値NULL
DateTXTは動的変数で、コードを実行している月を返します。
必要条件:コードを一度実行してテーブルを作成できる場所にMERGE、UPDATE、INSERT関数を使用しようとしています。
はその後毎月私は新しい月のコラムに永久的なテーブルを追加します。EXEC('ALTER TABLE StudentRanking
ADD ' + @DateTXT + ' smallint NOT NULL DEFAULT(999)')
| StudentID | Jan | Feb |
| 56789 | 2 | 999 |
| 12345 | 7 | 999 |
私は2月のために再び順位コードを実行し、私がマージするために使用する一時テーブル、にそれを保存します、更新、StudentRankingテーブルに挿入します。
EXEC('
MERGE StudentRanking AS TARGET
USING ##TEMPDB2 AS SOURCE ON (TARGET.StudentID = SOURCE.StudentID)
WHEN MATCHED AND TARGET.' + @DateTXT + ' <> SOURCE.' + @DateTXT + '
THEN UPDATE SET TARGET.' + @DateTXT + ' = SOURCE.' + @DateTXT + '
WHEN NOT MATCHED BY TARGET THEN
INSERT (StudentID, ' + @Rank_TXT + ')
VALUES (SOURCE.StudentID, SOURCE.' + @Rank_TXT + ') ')
| StudentID | Jan | Feb |
| 56789 | 2 | 3 |
| 12345 | 7 |null |
:
| StudentID | Feb |
| 56789 | 3 |
(note.. student 12345 doesn't come up)
は、だから私は実行しているリストで終わるしたいのですが
問題:生徒の中には学校を去る人がいるため、いくつかの生徒は学校を去ります。 12345)が2月にはランクを持っていないので、私は一時テーブルから結果を挿入しようとすると、私はこのエラーを取得する:私はISNULL(ランキングを行うことができ
SQL Server Database Error: Cannot insert the value NULL into column 'Feb', table 'tempdb.dbo.##TEMPDB'; column does not allow nulls. UPDATE fails.
を、0)が、私はむしろ、ヌルを持っていると思います0の
グローバルな一時表が使用されていることがわかりました。これらは並行性に非常に問題があります。このエラーが発生する理由は、列のテーブル定義がNULLを許可しないためです。 –
この解決策は恐ろしいことです。 'StudentID'と' Month'がプライマリキーを構成する適切に正規化されたテーブルを使うのはなぜですか?毎月テーブルに列を動的に追加し、それを更新するために動的SQLを使用することは、災害のためのレシピです。別のアプローチを採用していますか? – GarethD
別のアプローチを学ぶためにいつも開いています@GarethD 私はそれをうまくやっていましたが、より良い解決のための情報源があれば、お望みなら送信してください。 – AndrewRx