2017-08-27 63 views
1

我有一個C#應用程序,我使用的類型插入到一個SQL Server表:不能插入表中的SQL Server類型

CREATE TYPE [dbo].[taradodType] AS TABLE 
(
    [IDP] [int] NULL, 
    [date] [datetime] NULL, 
    [day] [nvarchar](max) NULL, 
    [nobatkari] [nvarchar](max) NULL, 
    [code] [nvarchar](max) NULL 
) 

C#代碼:

SqlConnection sqlconn = new SqlConnection(DBsetting.Connstring); 
sqlconn.Open(); 

using (sqlconn) 
{ 
    try 
    { 
     SqlCommand cmd = new SqlCommand("InsertTaradod", sqlconn); 
     cmd.CommandType = CommandType.StoredProcedure; 

     SqlParameter dtparam = cmd.Parameters.AddWithValue("@taradodType", dtreadd); 
     dtparam.SqlDbType = SqlDbType.Structured; 

     cmd.ExecuteNonQuery(); 

     MessageBox.Show("Saved!"); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

存儲過程:

ALTER PROCEDURE [dbo].[InsertTaradod] 
    @taradodType dbo.taradodType READONLY 
AS 
BEGIN 
    INSERT INTO dbo.taradod 
     SELECT * FROM @taradodType 
END 

而我不想插入重複的行到表中。所以我定義了一個不插入重複數據的索引。但這裏有一個問題。如果數據收集中只有1個重複行。該數據沒有被插入,但我想要插入的不重複

數據以外的數據:

1 2017-06-20 13:28:44 1 0 1 0 
    4 2017-06-22 12:18:13 1 0 1 0 
    2 2017-06-22 12:49:41 1 0 1 0 
    3 2017-06-22 13:15:24 1 0 1 0 
    1 2017-06-22 13:50:07 1 0 1 0 
    3 2017-06-24 06:56:05 1 0 1 0 
    1 2017-06-24 07:02:47 1 0 1 0 
    5 2017-06-24 07:29:37 1 0 1 0 
    7 2017-06-24 13:18:57 1 0 1 0 
    6 2017-06-24 13:19:00 1 0 1 0 
    8 2017-06-24 13:19:03 1 0 1 0 
    5 2017-06-24 13:19:07 1 0 1 0 
    3 2017-06-24 14:35:14 1 0 1 0 
    1 2017-06-24 14:38:04 1 0 1 0 
    3 2017-06-25 06:45:24 1 0 1 0 
    2 2017-06-25 06:54:48 1 0 1 0 
    1 2017-06-25 06:56:02 1 0 1 0 
    5 2017-06-25 07:51:32 1 0 1 0 
    6 2017-06-25 07:57:25 1 0 1 0 
    7 2017-06-25 07:57:30 1 0 1 0 
    8 2017-06-25 07:57:34 1 0 1 0 
    2 2017-06-25 13:03:55 1 0 1 0 
    5 2017-06-25 13:26:34 1 0 1 0 
    6 2017-06-25 13:32:56 1 0 1 0 
    8 2017-06-25 13:33:07 1 0 1 0 
    7 2017-06-25 13:33:10 1 0 1 0 
    1 2017-06-25 14:38:51 1 0 1 0 
    3 2017-06-25 14:39:21 1 0 1 0 
    4 2017-06-28 06:44:48 1 0 1 0 
    3 2017-06-28 06:45:48 1 0 1 0 
    1 2017-06-28 06:59:51 1 0 1 0 
    5 2017-06-28 07:21:28 1 0 1 0 
    9 2017-06-28 07:38:38 1 0 1 0 
    8 2017-06-28 07:49:19 1 0 1 0 
    6 2017-06-28 08:11:29 1 0 1 0 
    7 2017-06-28 08:11:34 1 0 1 0 
    8 2017-06-28 13:32:17 1 0 1 0 
    9 2017-06-28 13:32:20 1 0 1 0 
    7 2017-06-28 13:32:23 1 0 1 0 
    6 2017-06-28 13:32:27 1 0 1 0 
    5 2017-06-28 13:32:42 1 0 1 0 
    4 2017-06-28 14:17:00 1 0 1 0 
    3 2017-06-28 14:43:18 1 0 1 0 
    1 2017-06-28 15:27:57 1 0 1 0 
    4 2017-06-29 06:28:16 1 0 1 0 
    1 2017-06-29 06:55:45 1 0 1 0 
    3 2017-06-29 06:55:53 1 0 1 0 
    5 2017-06-29 07:34:44 1 0 1 0 
    8 2017-06-29 07:55:54 1 0 1 0 
    6 2017-06-29 07:55:57 1 0 1 0 
    9 2017-06-29 07:56:01 1 0 1 0 
    7 2017-06-29 08:00:26 1 0 1 0 
    9 2017-06-29 12:57:04 1 0 1 0 
    7 2017-06-29 12:57:12 1 0 1 0 
    8 2017-06-29 12:57:15 1 0 1 0 
    6 2017-06-29 12:57:33 1 0 1 0 
    5 2017-06-29 12:57:54 1 0 1 0 
    4 2017-06-29 13:01:06 1 0 1 0 
    3 2017-06-29 13:31:41 1 0 1 0 
    1 2017-06-29 13:31:50 1 0 1 0 
    4 2017-07-01 06:27:33 1 0 1 0 
    2 2017-07-01 06:50:55 1 0 1 0 
    3 2017-07-01 06:51:52 1 0 1 0 
    1 2017-07-01 07:02:29 1 0 1 0 
    5 2017-07-01 07:18:49 1 0 1 0 
    9 2017-07-01 07:27:00 1 0 1 0 
    8 2017-07-01 07:27:03 1 0 1 0 
    7 2017-07-01 07:52:45 1 0 1 0 
    6 2017-07-01 07:52:47 1 0 1 0 
    2 2017-07-01 12:54:23 1 0 1 0 
    7 2017-07-01 13:32:05 1 0 1 0 
    8 2017-07-01 13:32:15 1 0 1 0 
    9 2017-07-01 13:32:37 1 0 1 0 
    6 2017-07-01 13:32:52 1 0 1 0 
    4 2017-07-01 13:32:58 1 0 1 0 
    5 2017-07-01 13:33:07 1 0 1 0 
    1 2017-07-01 14:32:01 1 0 1 0 
    3 2017-07-01 14:32:32 1 0 1 0 
    4 2017-07-02 06:27:25 1 0 1 0 
    3 2017-07-02 06:47:46 1 0 1 0 
    1 2017-07-02 07:00:37 1 0 1 0 
    2 2017-07-02 07:00:42 1 0 1 0 
    5 2017-07-02 07:11:05 1 0 1 0 
    8 2017-07-02 07:23:47 1 0 1 0 
    9 2017-07-02 07:23:55 1 0 1 0 
    7 2017-07-02 07:34:37 1 0 1 0 
    6 2017-07-02 07:34:39 1 0 1 0 
    2 2017-07-02 13:00:14 1 0 1 0 
    8 2017-07-02 13:22:30 1 0 1 0 
    9 2017-07-02 13:22:34 1 0 1 0 
    6 2017-07-02 13:23:09 1 0 1 0 
    7 2017-07-02 13:23:23 1 0 1 0 
    5 2017-07-02 13:26:15 1 0 1 0 
    4 2017-07-02 14:05:00 1 0 1 0 
    3 2017-07-02 14:56:15 1 0 1 0 
    1 2017-07-02 15:27:23 1 0 1 0 
    4 2017-07-03 06:33:45 1 0 1 0 
    1 2017-07-03 07:04:39 1 0 1 0 
    5 2017-07-03 07:15:34 1 0 1 0 
    6 2017-07-03 08:37:04 1 0 1 0 
    7 2017-07-03 08:37:07 1 0 1 0 
    8 2017-07-03 09:59:10 1 0 1 0 
    9 2017-07-03 09:59:14 1 0 1 0 
    8 2017-07-03 13:59:10 1 0 1 0 
    9 2017-07-03 13:59:25 1 0 1 0 
    5 2017-07-03 13:59:33 1 0 1 0 
    7 2017-07-03 13:59:42 1 0 1 0 
    6 2017-07-03 13:59:46 1 0 1 0 
    4 2017-07-03 14:05:22 1 0 1 0 
    1 2017-07-03 14:35:43 1 0 1 0 
    4 2017-07-04 06:28:15 1 0 1 0 
    2 2017-07-04 06:46:19 1 0 1 0 
    1 2017-07-04 07:06:26 1 0 1 0 
    3 2017-07-04 07:10:29 1 0 1 0 
    5 2017-07-04 07:18:38 1 0 1 0 
    8 2017-07-04 07:55:10 1 0 1 0 
    9 2017-07-04 07:55:14 1 0 1 0 
    1 2017-07-04 07:55:42 1 0 1 0 
    7 2017-07-04 07:57:51 1 0 1 0 
    6 2017-07-04 07:57:54 1 0 1 0 
    1 2017-07-04 08:57:36 1 0 1 0 

指數是在IDdatetime

+0

爲什麼不換個'SELECT * FROM @ taradodType'查詢篩選,並選擇插入只會重複行。 –

+0

沒有問題是taradodType中沒有重複的行。我的意思是表中有該行,當它想插入taradodType中的重複數據時,它不能插入,因爲只有1個重複的行 – ssss

回答

0

看起來你已經有一些數據在dbo.taradod,並從@taradodType插入新的數據,你想要過濾掉dbo.taradod已經存在的行。

你可以嘗試選擇這樣的查詢:

SELECT * FROM @taradodType t1 
left outer join dbo.taradod t2 on t1.IDP = t2.IDP 
     and t1.date = t2.date 
where t2.IDP is null 
1

你插入命令就像一個批處理執行。

您的整個類型被傳遞給SQL Server存儲過程,並且它作爲批處理插入。

在您的存儲過程的INSERT聲明,添加NOT EXISTS檢查這樣的:

INSERT INTO dbo.taradod 
    SELECT Distinct * 
    FROM @taradodType a 
    WHERE NOT EXISTS (SELECT 1 
         FROM dbo.taradod 
         WHERE IDP = a.IDP 
         AND Code = a.Code 
         ...and other conditions which decide duplicate rows for you.) 

或者,你可以刪除@taradodType這已經dbo.taradod存在的行,然後執行INSERT語句中。

0

最簡單的解決方法...定義索引時,只需使用IGNORE_DUP_KEY = ON選項。

CREATE UNIQUE NONCLUSTERED INDEX ixu_IndexName ON dbo.taradodType (IDP) 
WITH (DROP_EXISTING = ON, IGNORE_DUP_KEY = ON) ON [PRIMARY]; 

不是遇到欺騙時拋出一個錯誤,它只是忽略了數據的違規行,向前移動像什麼都沒有發生。

HTH,傑森

+0

DROP_EXISTING會在這裏做什麼? – Amit

+0

您無法更改現有的索引。他們必須被丟棄並重新創建。 DROP_EXISTING = ON只是自動處理DROP INDEX部分......完全是可選的。 –