在我的应用程序中,有一个用于存储文本的表和另一个用于存储其各自图像的表..
我的表结构如下(tbl_article
):
article_id | Page_ID | article_Content
-----------+---------+-----------------
1 | 1 | hello world
2 | 1 | hello world 2
其中article_id
是pk并自动递增。
现在在我的另一张桌子(tbl_img
)中:
image_id| image_location|article_id | page_id
--------+---------------+-----------+---------
1 | imgae locat | 1 | 1
2 | image loc2 | 2 | 1
其中image_id
是pk并自动递增。
在两个表中,我通过表值参数插入数据,第二个表article_id
引用第一个表的article_id
。
要获得自动递增的列值,我使用的是输出子句:
DECLARE @TableOfIdentities TABLE
(
IdentValue INT,
PageId INT
)
INSERT INTO tbl_article(page_id, article_content)
OUTPUT Inserted.article_id, @pageId INTO @TableOfIdentities (IdentValue, PageId)
SELECT page_id, slogan_body_header
FROM @dtPageSlogan
INSERT INTO tbl_img(page_id, image_location)
SELECT page_id, image_location
FROM @dtPageImageContent
但现在我必须将@TableOfIdentities
中的值插入article_id
的{{1}} - 如何做?
答案 0 :(得分:0)
您需要加入 @dtPageImageContent
表变量及其公共@TableOfIdentities
上的page_id
表变量才能获取这些值:
-- add the third column "article_id" to your list of insert columns
INSERT INTO tbl_img(page_id, image_location, article_id)
-- select the "IdentValue" from your table of identities
SELECT pic.page_id, pic.image_location, toi.IdentValue
FROM @dtPageImageContent pic
-- join the "table of identities" on the common "page_id" column
INNER JOIN @TableOfIdentities toi ON pic.page_Id = toi.page_id
答案 1 :(得分:0)
您需要一个额外的列,从您的代码生成的临时文章ID,以正确链接图像和相关文章。所以你可以使用带有OUTPUT的MERGE,因为使用merge你可以引用目标和源的列并正确构建你的TableOfIdentities tvp,然后用dtPageImageContent将它连接到tbl_img上。
CREATE TABLE tbl_article (
article_id INT IDENTITY(1, 1) PRIMARY KEY
, Page_ID INT
, article_Content NVARCHAR(MAX)
);
CREATE TABLE tbl_img (
image_id INT IDENTITY(1, 1) PRIMARY KEY
, image_location VARCHAR(256)
, article_id INT
, Page_ID INT
);
DECLARE @TableOfIdentities TABLE
(
IdentValue INT,
PageId INT,
tmp_article_id INT
);
DECLARE @dtPageSlogan TABLE(
tmp_article_id INT -- generated in your code
, page_id INT
, slogan_body_header NVARCHAR(MAX)
);
DECLARE @dtPageImageContent TABLE (
page_id INT
, image_location VARCHAR(256)
, tmp_article_id INT -- needed to link each image to its article
)
-- create sample data
INSERT INTO @dtPageSlogan(tmp_article_id, page_id, slogan_body_header)
VALUES (10, 1, 'hello world');
INSERT INTO @dtPageSlogan(tmp_article_id, page_id, slogan_body_header)
VALUES (20, 1, 'hello world 2');
INSERT INTO @dtPageImageContent(page_id, image_location, tmp_article_id)
VALUES (1, 'image loc1', 10);
INSERT INTO @dtPageImageContent(page_id, image_location, tmp_article_id)
VALUES (1, 'image loc2', 20);
-- use merge to insert tbl_article and populate @TableOfIdentities
MERGE INTO tbl_article
USING (
SELECT ps.page_id, ps.slogan_body_header, ps.tmp_article_id
FROM @dtPageSlogan as ps
) AS D
ON 1 = 2
WHEN NOT MATCHED THEN
INSERT(page_id, article_content) VALUES (page_id, slogan_body_header)
OUTPUT Inserted.article_id, Inserted.page_id, D.tmp_article_id
INTO @TableOfIdentities (IdentValue, PageId, tmp_article_id)
;
-- join using page_id and tmp_article_id fields
INSERT INTO tbl_img(page_id, image_location, article_id)
-- select the "IdentValue" from your table of identities
SELECT pic.page_id, pic.image_location, toi.IdentValue
FROM @dtPageImageContent pic
-- join the "table of identities" on the common "page_id" column
INNER JOIN @TableOfIdentities toi
ON pic.page_Id = toi.PageId AND pic.tmp_article_id = toi.tmp_article_id
;