如何在SQL Server中获得所需的结果

时间:2017-12-24 06:56:42

标签: sql-server tsql

在我的应用程序中,有一个用于存储文本的表和另一个用于存储其各自图像的表..

我的表结构如下(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}} - 如何做?

2 个答案:

答案 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
;

You can try it on fiddle