申し訳ありませんが、問題を簡単かつ明確に説明する方法がわかりません。コードの簡略化されたバージョンを貼り付けましたが、うまく説明できれば幸いです。
デフォルト値を持つ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