抱歉,我不知道如何以简单明了的方式正确描述我的问题。我粘贴了我的代码的简化版本,希望它解释得很好。
我有一个具有默认值的非可空列的表:
CREATE TABLE [dbo].[DemoTable] (
...
[DemoColumn] [varchar](200) NOT NULL DEFAULT('None')
...
)
并且有一个proc通过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定义为:
CREATE TYPE UDT_Demo AS TABLE
(
...
[DemoColumn] [varchar](200) NULL
...
)
以下是我在C#代码中调用proc pr_Update_DemoTable
的方法:
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();
此代码将提供异常“无法在DemoTable.DemoColumn中插入NULL,因为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
答案 0 :(得分: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
答案 1 :(得分:0)
您可以使用
设置pr_Update_DemoTable
值来更新DemoColumn
程序
IFNULL(@demoUDT.DemoColumn, 'None')