があるので、条件付きでの使用のデフォルトの列値を挿入..を選択。
-
23-09-2019 - |
質問
私のコードを以下のように保存されている手順を挿入行のテーブので、そういった設定のカラム(FieldD)を@にprmSomeValueない限り、nullの場合、それ以外で利用のデフォルト値が定義されています。
IF (@prmSomeValue IS NULL)
INSERT INTO MyTable (fieldA,FieldB,FieldC)
SELECT A,B,C
FROM MyOtherTable
ELSE
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,@prmSomeValue
FROM MyOtherTable
この作品は、違反の乾燥原則とします。んの一部にアクセルを挿入します。ものの次の擬似コード.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
FROM MyOtherTable
誰でもそのアイデア?
更新-もう一ひねり
デフォルトの制約ではないリテラル値が関数として以下に示します。
...DEFAULT (suser_sname()) FOR [FieldD]
更新
やっとpuntedののうちいずれか少ない方の弊害でコピーされ、デフォルトの値機能の私にはクエリの代わりに下落を通じて、デフォルトに設定されています。んですが、女将が切り盛りしているこの店の仕事の少ない繰り返し自分を返します。
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
FROM MyOtherTable
解決
基本的に、これはSQL Serverがやっていることなので、あなたは少なくとも避けるために、このような何かを行うことができます2つのほぼ同じ文(擬似コード):
INSERT (columnA,B,C) ... ;
IF @prmSomeValue IS NOT NULL
UPDATE ... ;
私は、デフォルト値を持つCOALESCEへの道はないと思います。
他のヒント
私はあなたの方法で結構ですと言うでしょう。簡単なチェックは、1つの挿入が続きます。あなたはDRY心配している場合は、それが繰り返し呼び出されるように、コールをカプセル化します。
あなたがに、このシナリオを処理するための余分なコードを記述する必要があれば、私は(設計目標に依存します)デシベルの挿入/更新がいくつかのテーブル上に高価であってもよいことだと思いますので、私はトレードオフの関係に問題は見られません。
こののかもしれないの仕事、あなたはデフォルトの制約で、またはコードで定義されたデフォルト値を意味している場合に依存? 「制約」は、それが失敗した場合は、場合、「コード」はそれが動作します。 編集:あなたの平均制約。 DOH!
SELECT A,B,C,@prmSomeValue
FROM MyOtherTable
WHERE @prmSomeValue IS NOT NULL
UNION ALL
SELECT A,B,C,DEFAULT
FROM MyOtherTable
WHERE @prmSomeValue IS NULL
これまでの方法あなたがそれをしたいは、INSERT句で列を指定すると、値が必要です。
だからあなたの最初のソリューションは、あなたが...
持っているものです(ない非常にきれいなカントー)このかもしれない仕事のようなもの:
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,
case when @prmSomeValue is null
then
(SELECT text FROM syscomments WHERE id IN (SELECT cdefault FROM syscolumns
WHERE id = object_id('MyTable') AND cdefault > 0))
else @prmSomeValue
end
FROM MyOtherTable