我有下表
CREATE TABLE Topic_details(
topicid BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1)
,parent_topicid BIGINT
,description NVARCHAR(184) NOT NULL
,code NVARCHAR(43) NOT NULL
,lang_id INT
,entryby INT NOT NULL
,enrtydate DATE NOT NULL
,last_updateby INT
,last_update_date DATE
);
现在将一些样本数据插入其中
INSERT INTO Topic_details(topicid,parent_topicid,description,code,lang_id,entryby,enrtydate,last_updateby,last_update_date)
VALUES
(1,NULL,N'Overview of C',N'Overview of C',NULL,10238,'2017-06-10 13:09:52.297',NULL,NULL)
,(2,1,N'Features of C',N'Features of C',NULL,10238,'2017-06-10 13:10:09.060',NULL,NULL)
,(3,1,N'C Language Applications',N'C Language Applications',NULL,10238,'2017-06-10 13:13:13.607',NULL,NULL)
,(4,1,N'C Program Execution',N'C Program Execution',NULL,10238,'2017-06-10 13:13:32.623',NULL,NULL)
,(5,1,N'What is Interpreter ?',N'What is Interpreter ?',NULL,10238,'2017-06-10 13:14:17.897',NULL,NULL)
现在在我的应用程序中,需要从excel插入这些数据。
现在,用户上传的工作表包含三列
ParentTopicName|TopicName|Code|
---------------|---------|----|
然后让一些样本数据进入,
ParentTopicName|TopicName|Code|
---------------|---------|----|
|Joins |Join|
----------------|---------|----|
Joins | Inner J | IJ |
-------------------------------|
Joins | Left J | LJ |
现在我有一个存储excel数据的数据表。
现在,在程序中
Create ROCEDURE [dbo].[sp_upload_topic_subtopic]
@entry_by bigint = null,
@lang_id nvarchar(20) = null,
@dtTopicSubtopic ttTopicSubtopic ReadOnly -- to store value from datatable
AS
BEGIN
INSERT INTO dbo.topic_details([description], code,entryby,enrtydate,lang_id)
SELECT d.TopicName, d.TopicCode,@entry_by,Getdate(),1 from @dtTopicSubtopic as d
UPDATE td
SET td.parent_topicid= ptd.topicid
FROM dbo.topic_details td
INNER JOIN @dtTopicSubtopic d ON d.TopicName=td.[description]
INNER JOIN topic_details ptd ON d.ParentTopic=ptd.[description]
END
这将在Topic_Details表中按预期存储数据 存入表格后,
---------------------------------------------------
Topic_Details
---------------------------------------------------
TopicId |ParentTopiID|desciption|Code|.....
---------------|------------|----------|----|.....
1 | NULL | Joins |Join|.....
---------------|------------|----------|----|.....
2 | 1 | Inner J | IJ |.....
---------------|------------|----------|----|.....
3 | inserted data..................
--------------|------------------------------------
4 | inserted data...................
--------------|-------------------------------------
现在假设我从excel插入另一行。 (请注意 Inner j 已经出现在我的表格中,我再次插入 Inner J 。)
ParentTopicName|TopicName |Code|
---------------|--------- |----|
|Inner J |Ij |
----------------|--------- |----|
Inner J |Some Thing| dj |
这会将数据插入Topic_details表,如下所示
TopicId |ParentTopiID|desciption|Code|.....
---------------|------------|----------|----|.....
1 | NULL | Joins |Join|.....
---------------|------------|----------|----|.....
2 | 1 | Inner J | IJ |.....
3......
4......
5 | Null | Inner J | IJ | ....
-------------|-------------|------------|----|-----
6 | 2 | Something|hfdj|......
但是作为内心的J'已经出现在我的桌子上,所以,
最终输出我想要的东西
------------------------------------------------------
Topic_details
-------------------------------------------------------
TopicId |ParentTopiID|desciption|Code|.....
---------------|------------|----------|----|.....
1 | NULL | Joins |Join|.....
---------------|------------|----------|----|.....
2 | 1 | Inner J | IJ |.....
---------------|------------|----------|-----|
3.....................
4.....................
5.....................
-------------|-------------|------------|----|-----
6 | 2 | Something|hfdj|......
我怎样才能做到这一点?
答案 0 :(得分:0)
如果我理解你的问题,你不想插入重复的记录。
INSERT INTO dbo.topic_details([description], code,entryby,enrtydate,lang_id)
SELECT d.TopicName, d.TopicCode,@entry_by,Getdate(),1 from @dtTopicSubtopic as d
WHERE NOT EXISTS( SELECT * FROM dbo.topic_details AS Cur WHERE Cur.TopicName = d.TopicName AND Cur.TopicCode = d.TopicCode )
以上代码检查TopicName
中是否已存在具有给定TopicCode
和dbo.topic_details
的记录,但未插入该记录。
经过多次混淆之后,事实证明OP查询已经有效了。
我注意到的另一个问题是topicid BIGINT
和parent_topicid INTEGER
具有不同的数据类型。他们应该使用相同的列,这些列建立关系,并经常加入。