0

申し訳ありませんが、問題を簡単かつ明確に説明する方法がわかりません。コードの簡略化されたバージョンを貼り付けましたが、うまく説明できれば幸いです。

デフォルト値を持つnull不可の列を持つテーブルがあります:

CREATE TABLE [dbo].[DemoTable] (
...
[DemoColumn] [varchar](200) NOT NULL DEFAULT('None')
...
)

UDT を介して DemoTable を更新する proc があります。UDT_Demo

CREATE PROCEDURE pr_Update_DemoTable
    @demoUDT UDT_Demo READONLY
AS
BEGIN
    MERGE DemoTable
    USING @demoUDT
    ON ...
    WHEN MATCHED
    THEN UPDATE
    SET ...
        DemoTable.DemoColumn = @demoUDT.DemoColumn,
        ...
    WHEN NOT MATCHED BY TARGET
    THEN INSERT
    (... DemoColumn ... ) VALUES (... @demoUDT.DemoColumn ...)
END 

UDT_Demo は次のように定義されます。

CREATE TYPE UDT_Demo AS TABLE
(
...
[DemoColumn] [varchar](200) NULL
...
)

pr_Update_DemoTable以下は、C# コードでproc を呼び出す方法です。

DataTable udt_Demo = new DataTable();
...
udt_Demo.Columns.Add("DemoColumn");
...
udt_Demo.Rows.Add(new object[] { ... demoColumnValue ... }); // demoColumnValue is null in this case

SqlCommand command = new SqlCommand("pr_Update_DemoTable");
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("demoUDT", udt_Demo);
... // some addtional logic to prepare for the execution
command.ExecuteNonQuery();

このコードは、「DemoColumn が null 可能でないため、DemoTable.DemoColumn に NULL を挿入できません」という例外を発生させます。

=======私が試した他のアプローチ======

アプローチ 1:

UDT_Demo 定義を次のように変更した場合

CREATE TYPE UDT_Demo AS TABLE
(
...
[DemoColumn] [varchar](200) NOT NULL DEFAULT('None')
...
)

例外メッセージは、「DemoColumn が null 可能でないため、UDT_Demo.DemoColumn に NULL を挿入できません」になります。

アプローチ 2:

C# コードで DemoColumn 値を指定しないと、「挿入された値の数がテーブルの列数と一致しません」という例外が発生します。

アプローチ 3:

これは現在機能していますが、理想的ではありません。デフォルト値をハードコーディングしたくありません。

DataTable udt_Demo = new DataTable();
...
udt_Demo.Columns.Add("UDTColumn");
...
udt_Demo.Rows.Add(new object[] { ... demoColumnValue ?? "None" ... });
... // the rest of the code is the same
4

2 に答える 2

0

を使用して値をpr_Update_DemoTable設定することで手順を更新できますDemoColumn

IFNULL(@demoUDT.DemoColumn, 'None')
于 2013-10-18T16:24:12.793 に答える
0

SQL でデフォルト値を使用する場合は、insert ステートメントで列を宣言しないでください。

CREATE TABLE [dbo].[testDefault](
[col1] [int] NULL,
[col2] [varchar](50) NULL,
[col3] [nchar](10) NOT NULL
) ON [PRIMARY]

ALTER TABLE [dbo].[testDefault] ADD  CONSTRAINT [DF_testDefault_col3]  DEFAULT ('test') FOR [col3]

データの挿入

INSERT INTO testDefault
(col1, col2)
VALUES(1, 'TEST') -- not declaring col3

テーブルから選ぶ

SELECT * FROM testDefault

あなたに結果を与えるでしょう

col1    col2        col3
1       TEST        test      
于 2013-10-18T16:15:52.350 に答える