2016-12-12 16 views
7

tôi đã xác định các bảng sauCú pháp để chèn danh tính FROM không có cột để chèn?

CREATE TABLE dbo.T_Comments_Paths 
(
    path_id bigint IDENTITY(1,1) NOT NULL 
    ,CONSTRAINT [PK_T_Comments_Paths] PRIMARY KEY(path_id) 
); 


CREATE TABLE dbo.T_Comments 
(
    COM_Id int IDENTITY(1,1) NOT NULL 
    ,COM_Text NATIONAL CHARACTER VARYING(255) NULL 
    ,CONSTRAINT [PK_T_Comments] PRIMARY KEY(COM_Id) 
); 

Nếu tôi cần để có được một con đường-id cho một lời nhận xét, đối với một đơn giá trị, tôi có thể lấy nó như thế này:

DECLARE @outputTable TABLE (path_id bigint); 
INSERT INTO T_Comments_Paths OUTPUT INSERTED.path_id INTO @outputTable DEFAULT VALUES; 
SET @__pathuid = (SELECT TOP 1 id FROM @outputTable); 

Tuy nhiên, Tôi không tìm thấy cú pháp để nhận các id được chèn (nhiều) cho một chèn từ một bảng khác.

ví dụ: Tôi muốn làm điều này:

DECLARE @outputTable TABLE (path_id bigint, com_id bigint); 
INSERT INTO T_Comments_Paths 
OUTPUT INSERTED.path_id, com_id INTO @outputTable DEFAULT VALUES 
FROM T_Comments 

này mang lại

"cú pháp không đúng gần FROM-khóa"

Làm thế nào tôi có thể làm điều đó (không có con trỏ)?
Lưu ý: Tôi cần tương thích với MySQL, vì vậy tôi không thể sử dụng newid(), vì không có uuid-type trong MySQL, và tôi không muốn sử dụng varchar hoặc varbinary ...

+0

@Ivan Starostin: Đó không phải là bản sao, anh ấy chỉ chèn một giá trị. Tìm thấy bài đăng này là tốt. Đó không phải là điều tôi muốn. –

+0

Bạn đã thử thêm tiền tố com_id bằng INSERTED chưa? Vì vậy: OUTPUT INSERTED.path_id, INSERTED.com_id INTO @outputTable DEFAULT VALUES? –

+0

@ John Joseph: Tôi không chèn com_id vào T_Comments_Paths, tôi chỉ bao gồm nó trong bảng kết quả đầu ra, cùng với autoid được tạo ra. –

Trả lời

1

Nếu tôi hiểu chính xác, vấn đề của bạn sẽ giảm xuống: Thêm n hàng mới vào cột nhận dạng và sau đó đưa các giá trị mới được thêm vào để cập nhật cột trống trong bảng có n hàng (@outputTable) mà không phải lo lắng về kết hợp.

Thiết lập để thử nghiệm

CREATE TABLE #T_Comments_Paths (
    path_id BIGINT IDENTITY(1,1) NOT NULL 
    , CONSTRAINT [PK1] PRIMARY KEY (path_id) 
); 

CREATE TABLE #T_Comments (
    com_id BIGINT IDENTITY(1,1) NOT NULL 
    , com_text NVARCHAR(20) NULL 
    , CONSTRAINT [PK2] PRIMARY KEY (com_id) 
); 

INSERT INTO #T_comments (com_text) 
VALUES 
('com1') 
, ('com2'); 

** SOLUTION 1 **

Nếu bạn sẵn sàng để thêm một cột bổ sung cho các @outputTable (aka rowNo), bạn có thể có được một giải pháp ngắn hơn như này:

--Add a few values to make #T_Comment_Paths not empty, for testing purpose, making things not matching 
INSERT INTO #T_Comments_Paths DEFAULT VALUES; 
INSERT INTO #T_Comments_Paths DEFAULT VALUES; 
INSERT INTO #T_Comments_Paths DEFAULT VALUES; 

DECLARE @currentID BIGINT; 
SELECT @currentID = IDENT_CURRENT('#T_Comments_Paths'); 
-- @currentID should be 3 

DECLARE @outputTable TABLE (path_id bigint, com_id bigint, rowNo bigInt); 

INSERT INTO @outputTable (com_id, rowNo) 
SELECT 
    com_id 
    , ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
FROM 
    #T_comments; 

MERGE #T_Comments_Paths tgt 
USING @outputTable src 
ON tgt.path_id = src.path_id 
WHEN NOT MATCHED THEN INSERT DEFAULT VALUES; 

MERGE @outputTable tgt 
USING (
    SELECT 
     path_id 
     , ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNo 
    FROM 
     #T_Comments_Paths 
    WHERE 
     path_id > @currentID 
) src 
ON tgt.RowNo = src.RowNo 
WHEN MATCHED THEN UPDATE SET 
    tgt.path_id = src.PATH_ID; 

SELECT * 
FROM 
    @outputTable; 

SELECT * 
FROM 
    #T_Comments_Paths 

DROP TABLE #T_Comments; 
DROP TABLE #T_Comments_Paths; 

** GIẢI PHÁP 2 **

Nếu bạn khăng khăng chỉ có 2 cột trong @outputTable, thì đây là giải pháp (dài hơn)

--Add a few values to make #T_Comment_Paths not empty, for testing purpose 
INSERT INTO #T_Comments_Paths DEFAULT VALUES; 
INSERT INTO #T_Comments_Paths DEFAULT VALUES; 
INSERT INTO #T_Comments_Paths DEFAULT VALUES; 
DECLARE @currentID BIGINT; 
SELECT @currentID = IDENT_CURRENT('#T_Comments_Paths'); 
-- @currentID should be 3 

DECLARE @outputTable TABLE (path_id bigint, com_id bigint); 
DECLARE @outputMiddleTable TABLE (rowNo bigint, com_id bigint); 


INSERT INTO @outputTable (com_id) 
SELECT 
    com_id 
FROM 
    #T_comments; 

WITH cte AS (
    SELECT 
     com_id 
     , ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNo 
    FROM 
     @outputTable 
) 
INSERT INTO @outputMiddleTable (rowNo,com_id) 
SELECT RowNo, com_id 
FROM cte; 

MERGE #T_Comments_Paths tgt 
USING @outputTable src 
ON tgt.path_id = src.path_id 
WHEN NOT MATCHED THEN INSERT DEFAULT VALUES; 

WITH cte1 AS (
SELECT 
    path_id 
    , ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNo 
FROM 
    #T_Comments_Paths 
WHERE 
    path_id > @currentID 
), cte2 AS (
SELECT 
    cte1.path_id 
    , t1.com_id 
FROM 
    @outputMiddleTable t1 
    JOIN cte1 ON t1.rowNo = cte1.RowNo 
) 
UPDATE ot 
SET path_id = cte2.path_id 
FROM @outputTable ot 
    JOIN cte2 ON ot.com_id = cte2.com_id 

SELECT * 
FROM 
    @outputTable; 


DROP TABLE #T_Comments; 
DROP TABLE #T_Comments_Paths; 
+1

Trong trường hợp nó không được rõ ràng: Tôi nhấn mạnh vào 0 cột bổ sung, và hai cột đầu ra, nghiêm chỉnh. Với cột bổ sung, nó ngắn hơn nhiều so với bất kỳ giải pháp nào của bạn, tất cả đều thêm cột bổ sung. Cũng hợp nhất là không cần thiết cũng không mong muốn. Nó chỉ là một nguồn lỗi cho một môi trường đa luồng. –

+0

Tôi có nghĩa là một cột thêm vào outputTable bảng biến, không phải bảng T_Comments_Paths ban đầu (mà trong các giải pháp của tôi, nó là #T_Comments_Paths). Tôi đưa vào hai giải pháp, một với một cột bổ sung trong biến outputTable, cột kia không có cột bổ sung trong outputTable biến (nhưng nó cần thêm một biến bảng) – DVT

+1

Tôi không nghĩ rằng bất cứ ai đọc điều này sẽ hiểu những gì đang xảy ra. Vì lý do đó một mình, nó không thể được gọi là một "giải pháp". Ngoài ra, tôi không thấy những lợi ích này cung cấp trên một con trỏ. Nó dài hơn và phức tạp hơn. Tôi đang cố gắng viết mã độc lập, RDBMS di động, do đó, muốn một vài thứ như thế này là kỹ thuật có thể. Đã đi với một cột bổ sung, vì đó là giải pháp duy nhất ngăn chặn những thứ như con trỏ hay điều này. Câu trả lời đúng cho câu hỏi là: "không thể". –

Các vấn đề liên quan