4

ストアドプロシージャの挿入で列のデフォルト値を使用したいので、複数の場所でデフォルト値を繰り返す必要はありません(変更される可能性があります... DRYの原則)。

T-SQL INSERT操作には、次のように使用できる便利な「default」キーワードがあります。

Declare @newA varchar(10)
Set @newA = 'Foo2'

-- I can use "default" like so...
Insert into Table_1 (
    A, 
    B) 
Values (
    @newA, 
    default)

ただし、条件付きで何かを行う必要がある場合、caseステートメントで「default」を返すことができないようです。

-- How do I use 'default' in a case statement? 
INSERT INTO Table_1 (
    A,
    B )
VALUES (
    @newA,
    CASE WHEN (@newA <> 'Foo2') THEN 'bar' ELSE default END)
-- > yeilds "Incorrect syntax near the keyword 'default'."

デフォルトを挿入し、必要に応じて次のように更新できます。

INSERT INTO Table_1 (
    A,
    B )
VALUES (
    @newA,
    default)
UPDATE Table_1 
SET B = CASE WHEN (A <> 'Foo2') THEN 'bar' ELSE B END
WHERE ID = SCOPE_IDENTITY()

でも、誰かに「もっといい方法がある…」と言ってもらいたいです。

これが役立つ場合は、この例のテーブル定義を次に示します...

CREATE TABLE dbo.Table_1 (
    ID int NOT NULL IDENTITY (1, 1),
    A varchar(10) NULL,
    B varchar(10) NULL  )  
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT DF_Table_1_A DEFAULT 'A-Def' FOR A
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT DF_Table_1_B DEFAULT 'B-Def' FOR B
GO
4

1 に答える 1

3

defaultブロック内からのみ機能します。これは、ステートメントVALUES()で許容できる値ではないようです。CASEifステートメントを使用して、何を挿入するかを決定できます。

DECLARE @newA varchar(10) = 'Foo2'

IF (@newA <> 'Foo2')
BEGIN
   INSERT INTO Table_1 (A, B)
   SELECT @newA, 'bar'
END
ELSE
BEGIN
   --If you are using default values, you do not have to specify the column
   INSERT INTO Table_1 (A) 
   SELECT @newA
END

これは、挿入後に更新するよりも優れていると思います。そのため、正しいデータのみをテーブルに挿入します。また、INSERTS / UPDATESの数は1に保たれます。また、スコーピングのために@@IDENTITYを使用する場合も注意が必要です。SCOPE_IDENTITY()を調べることを検討してください。

于 2012-10-29T23:20:42.950 に答える