對不起,我不知道如何以簡單明瞭的方式正確描述我的問題。我粘貼了我的代碼的簡化版本,希望它解釋得很好。無法通過UDT插入到具有默認值的非空列中
我有具有與默認值的非空列的表:
CREATE TABLE [dbo].[DemoTable] (
...
[DemoColumn] [varchar](200) NOT NULL DEFAULT('None')
...
)
並且存在經由UDT 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被定義爲更新DemoTable一個PROC :
CREATE TYPE UDT_Demo AS TABLE
(
...
[DemoColumn] [varchar](200) NULL
...
)
以下是我如何調用proc pr_Update_DemoTable
在C#代碼:
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();
此代碼會給例外「不能將NULL插入DemoTable.DemoColumn因爲DemoColumn不能爲空」
=======我試過其他方法== ====
方法1:
如果我修改UDT_Demo定義
CREATE TYPE UDT_Demo AS TABLE
(
...
[DemoColumn] [varchar](200) NOT NULL DEFAULT('None')
...
)
的異常信息將成爲「不能將NULL插入UDT_Demo.DemoColumn因爲DemoColumn不能爲空」
方法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
我知道這一點,但它並沒有幫助我的問題。 – Jimbo