2014-02-18 86 views
2

我有兩個表,名爲'ticket''ticket_category'。 'Ticket'表具有'Ticket_Uid'列,其類型爲'UniqueIdentifier'。 'ticket'中的每個'ticket_uid'表在'ticket_category'表中具有一對多映射。 例如在表中插入逗號分隔值時出錯:SQL Server 2008

'票' 表:

Ticket_Uid 
100 

Ticket_Category:

Ticket_Uid Ticket_Category_Uid 
100   ABC 
100   DEF 
100   XYZ 

我想創建一個名爲'comment_mining'下表:

Ticket_Uid Category_List 
100   ABC,DEF,XYZ 

表已經使用以下方法創建:

create table dbo.comment_mining 
(
Ticket_UID [uniqueidentifier] NOT NULL, 
time_created datetime, 
time_closed datetime, 
total_time_taken int, 
category_list nvarchar(500), 
comment_list varchar(8000) 
); 

我已經創造了這個表,並填充「Ticket_Uid」列。

對於插入「category_list」專欄中,我使用下面的查詢:

insert into dbo.comment_mining(category_list) 
SELECT 
    (SELECT distinct convert(varchar(500),category_id) + ',' AS [text()] 
    FROM ticket_category pr 
    WHERE pr.ticket_uid = p.ticket_uid 
    FOR XML PATH ('')) 
AS Category_list 
FROM comment_mining p 

當我運行上面的查詢,它給了我下面的錯誤:

Msg 515, Level 16, State 2, Line 1 
Cannot insert the value NULL into column 'Ticket_UID', table 'Support_Saas.dbo.comment_mining'; column does not allow nulls. INSERT fails. 
The statement has been terminated. 

(其是奇怪的,因爲我甚至沒有插入'Ticket_Uid'列)

當我運行相同的查詢沒有插入語句,它完美執行。查詢如下:

SELECT 
    (SELECT distinct convert(varchar(500),category_id) + ',' AS [text()] 
    FROM ticket_category pr 
    WHERE pr.ticket_uid = p.ticket_uid 
    FOR XML PATH ('')) 
AS Category_list 
FROM comment_mining p 

是有當上述查詢運行一些NULL值,但「comment_mining」表可以接受NULL值「category_list」列。爲什麼'ticket_Uid'列中的錯誤?

請問有人能解釋爲什麼會發生這種情況,這有什麼治療?

P.S. - 我是SQL新手。

回答

1

你對錶comment_mining插入錯誤的原因是因爲你設置的Ticket_Uidnot null;但是,由於它沒有默認值,插入失敗,因爲無論您是專門插入該字段還是不插入該字段,當創建一行時,所有列都必須填寫或爲null

你可以做的兩兩件事之一:


  • 更改comment_mining表的結構有一個defaultTicket_Uid(您可以在表設計或代碼做到這一點:

實施例1:

Alter Table comment_mining 
    Add Constraint DF_CommentMining_1 default NewID() for Ticket_UID 

  • 讓您的插入物通過使用SQL NewID()函數來填充Ticket_UID UniqueIdentifier

實施例2明確地包括所生成的uniqueidentifier(GUID)值:

insert into dbo.comment_mining(Ticket_Uid, category_list) 
SELECT NewID(), 
    [ your subquery ]... 

在這兩種情況下,您現在都可以通過使其自動填充本身或通過提供值來滿足comment_mining.Ticket_UID上的NOT NULL約束。

+0

感謝您的回覆。我只是想出了它。你是絕對正確的。當我從ticket_uid中刪除約束時,我能夠正確插入。 – Patthebug

0

試試這個,

;with cte as 
( 
select 100 Ticket_Uid,'ABC' Ticket_Category_Uid union all 
select 100 , 'DEF' union all 
select 100, 'XYZ' 
) 

select distinct b.Ticket_Uid, 
stuff((select ','+a.Ticket_Category_Uid from cte a where a.Ticket_Uid=b.Ticket_Uid for xml path('')),1,1,'') 

from cte b