2013-10-18 41 views
0

對不起,我不知道如何以簡單明瞭的方式正確描述我的問題。我粘貼了我的代碼的簡化版本,希望它解釋得很好。無法通過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 

回答

0

如果您希望SQL使用默認值,則不應在插入語句中聲明該列。

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  
+0

我知道這一點,但它並沒有幫助我的問題。 – Jimbo

0

你可以通過設置更新pr_Update_DemoTable程序選擇使用價值

IFNULL(@demoUDT.DemoColumn, 'None') 
+0

謝謝。但這與我的方法3基本相同,對嗎?硬編碼的'None'出現在兩個地方,一個在表創建腳本中,另一個在proc定義腳本中。理想情況下,我們希望硬編碼的字符串只出現在1個地方。 – Jimbo

相關問題