>我有下表
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 插入另一行。(请注意,内 j已经存在于我的表中,我再次插入内 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|......
我怎样才能做到这一点?
如果我正确理解您的问题,您不想插入重复的记录。
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
是不同的数据类型。它们应使用与这些列建立关系相同的列,并且将频繁连接。