INSERT_IDENTITY ব্যবহার করে একাধিক সম্পর্কিত সারণীতে নির্বাচন করতে প্রবেশ করান


10

ঠিক আছে দৃশ্য সেট। আমি তিনটি টেবিল, আছে ( Table1, Table2এবং DataTable) এবং আমি মধ্যে সন্নিবেশ করতে চান Table1এবং Table2ব্যবহার DataTableউৎস হিসেবে। তাই প্রত্যেক সারি জন্য DataTableআমি একটি সারিতে চান Table1এবং Table2, এবং Table2চাহিদা সন্নিবেশিত আছে idথেকে (পি কে) Table1...

আমি যদি এই কাজটি করতাম ...

INSERT INTO Table1 SELECT A, B, C FROM MyTable
INSERT INTO Table2 SELECT IDENTITY_INSERT(), D, E, F FROM MyTable

আমি IDসর্বশেষ sertedোকানো রেকর্ডটি পেতে চাই Table1

একটি হল CURSORবা WHILEলুপ এই কাজ করতে শুধুমাত্র উপায়?

উত্তর:


10

আপনার জন্য কার্যকর হতে পারে এমন একটি সমাধান হ'ল OUTPUT ধারাটি ব্যবহার করা হয়, যা সমস্ত .োকানো সারিগুলিকে আলাদা করে দেয়, যাতে আপনি সেগুলি আবার অন্য কোনও টেবিলে সন্নিবেশ করতে পারেন। যাইহোক, এটি টেবিল 2 এ বিদেশী কী বাধাগুলির সীমাবদ্ধতা রাখে, যদি মেমরিটি পরিবেশন করে।

যাইহোক, সমাধানটি এরকম কিছু দেখায়:

MERGE INTO Table1 AS t1
USING MyTable ON 1=0 -- always generates "not matched by target"

WHEN NOT MATCHED BY TARGET THEN
    -- INSERT into Table1:
    INSERT (A, B, C) VALUES (t1.A, t1.B, t1.C)

--- .. and INSERT into Table2:
OUTPUT inserted.ID, MyTable.D, MyTable.E, MyTable.F
INTO Table2 (ID, D, E, F);

মার্জ, অন্যান্য ডিএমএলের বিবৃতিগুলির বিপরীতে, কেবলমাত্র insertedএবং অন্যান্য টেবিলে রেফারেন্স দিতে পারে deleted, যা এখানে আপনার জন্য দরকারী for

আরও: http://sqlsunday.com/2013/08/04/cool- विसর- ফিচার /


4

আপনি যদি নিয়মিতভাবে এটি করার পরিকল্পনা করছেন (যেমন এটি অ্যাপ্লিকেশন যুক্তির অংশ এবং এটি এক-উপাত্ত ডেটা ট্রান্সফর্মেশন অনুশীলন নয়) তবে আপনি টেবিল 1 এবং টেবিল 2 INSTEAD OF INSERTএ ডেটা বিভক্ত করার ব্যবস্থা করতে একটি ট্রিগার দিয়ে (এবং সাজানোর ব্যবস্থা ) ব্যবহার করতে পারেন কীগুলি / সম্পর্কগুলি) - তবে আপনি কেবল এইটি করবেন:

INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable

এবং ট্রিগারটি এত সহজ হতে পারে:

CREATE trg_newview_insert TRIGGER newView INSTEAD OF UPDATE AS 
    INSERT table1 SELECT ID, A, B, C FROM inserted
    INSERT table2 SELECT ID, D, E, F FROM inserted
GO

ধারণাটি ধারণাটি এমন কিছু:

CREATE VIEW newView AS 
SELECT table1.ID, A, B, C, D, E, F 
FROM table1 
    JOIN table2 ON table1.ID = table2.ID;

বা যদি অন্য টেবিলে সারি সারি নাও সারণী থাকতে পারে:

CREATE VIEW newView AS 
SELECT ISNULL(table1.ID, table2.ID), A, B, C, D, E, F 
FROM table1 
    FULL OUTER JOIN table2 ON table1.ID = table2.ID;

(অবশ্যই আপনি যখন SELECTভিউ থেকে কোন সারি আউটপুট দিচ্ছেন তা গুরুত্বহীন যদি আপনি এর থেকে উদ্দিষ্ট না হন SELECTএবং এটি কেবল INSERTতার যাদু করার জন্য কোনও টেম্পলেট সরবরাহ করতে পারে)

এটি ধরে নেওয়া হচ্ছে যে আপনি এই ক্ষেত্রে আপনার প্রাথমিক কীটির জন্য একটি ইউইউডি টাইপ ব্যবহার করার পরিকল্পনা করছেন - আপনি যদি টেবিল 1 এ একটি স্বয়ংক্রিয়ভাবে বর্ধক পূর্ণসংখ্যা কী ব্যবহার করছেন তবে আরও কিছু কাজ করার দরকার আছে। নিম্নলিখিতগুলির মতো কিছু কাজ করতে পারে:

CREATE trg_newview_insert TRIGGER newView INSTEAD OF UPDATE AS 
    INSERT table1 (A, B, C) 
    SELECT A, B, C 
    FROM inserted;
    INSERT table2 (ID, D, E, F) 
    SELECT ID, D, E, F 
    FROM table1 AS t 
        JOIN inserted AS i ON t.A = i.A AND t.B = i.B AND t.C = i.C;
GO

এবং প্রকৃতপক্ষে যে INSERTবিবৃতিগুলির জুড়ি সরাসরি এমন এক-অফ হিসাবে সরাসরি কাজ করতে পারে (আপনি কী ব্যবহার করছেন INT IDENTITYবা UNIQUEIDENTIFIER DEFAULT NEWID()কীটির জন্য টাইপ করছেন):

INSERT table1 (A, B, C) 
SELECT A, B, C 
FROM MyTable;
INSERT table2 (ID, D, E, F) 
SELECT ID, D, E, F 
FROM table1 AS t 
    JOIN MyTable AS i ON t.A = i.A AND t.B = i.B AND t.C = i.C;

দেখার প্রয়োজনকে অবহেলা করা এবং সম্পূর্ণ ট্রিগার করা, যদিও এটি যদি কোনও অপারেশন হয় তবে আপনি আপনার কোডটিতে প্রায়শই সম্পাদন করবেন ভিউ + ট্রিগারটি প্রতিবার একাধিক বিবৃতি প্রয়োজনের জন্য বিমূর্ত করার জন্য বিবেচ্য হবে।

কায়েট: উপরের সমস্ত এসকিউএল চিন্তা থেকে টাইপ করা হয়েছে এবং পরীক্ষা করা হয়নি, আপনার প্রয়োজন অনুযায়ী কাজ করবে এমন কোনও গ্যারান্টি না থাকার আগে এটির কাজ করা দরকার।


3

আপনার পছন্দ মতো মনে হচ্ছে:

INSERT dbo.Table1(A,B,C) SELECT A,B,C 
  FROM dbo.DataTable WHERE <identify one row>;

INSERT dbo.Table2(ID,D,E,F) SELECT SCOPE_IDENTITY(),D,E,F
  FROM dbo.DataTable WHERE <identify that same row>;

অথবা কেবলমাত্র একটি টেবিল ব্যবহার করুন, যদি আপনি সর্বদা প্রতিটি টেবিলের মধ্যে একটি সারি রাখেন ... তবে এগুলি একাধিক টেবিলগুলিতে বিভক্ত করার কোনও যুক্তিসঙ্গত কারণ আছে কি?


1
আমি প্রকল্পটিতে কাজ করার আগে সিস্টেমটি ছিল এবং টেস্টের উত্তরাধিকারী টেবিলের উত্তরাধিকার চেষ্টা করতে চেয়েছিল, এটি ভাল যদি আপনি সত্তা ফ্রেমওয়ার্ক ব্যবহার করছেন এবং কোড থেকে স্টাফ করছেন তবে এটি আপনার কাছ থেকে সব কিছু গোপন করে তবে আপনাকে যখন স্যুইচ করতে হবে দুর্বল পারফরম্যান্সের কারণে এডিও-তে এটি দুঃস্বপ্ন!
m4rc

1

আপনার প্রশ্ন এবং অন্যান্য উত্তরের মন্তব্যগুলি পড়া থেকে মনে হচ্ছে আপনি কোনও সমস্যাটিকে DataTableদুটি নতুন টেবিলের মধ্যে বিভক্ত করে ঠিক করার চেষ্টা করছেন ।

আমি ধরে নিয়েছি DataTableএরই মধ্যে একটির মতো একক অনন্য ক্ষেত্র নেই IDENTITY(1,1)? যদি তা না হয় তবে সম্ভবত আপনার একটিতে এটি যুক্ত করা উচিত যা আপনি ডেটা .োকাতে Table1এবং ব্যবহার করতে পারেন Table2

উদাহরণ দিয়ে; আমি একটি নমুনা স্কিমা তৈরি করেছি, এতে পরীক্ষার ডেটা sertedোকানো হয়েছে, একটি কলাম থাকতে DataTableসংশোধন DataTableকরেছি IDENTITY(1,1), তারপরে এটি উভয়তে ডেটা toোকাতে Table1এবং এটি ব্যবহার করেছি Table2:

USE tempdb;
GO

CREATE TABLE dbo.DataTable
(
    A INT
    , B INT
    , C INT
    , D INT
    , E INT
    , F INT
);

INSERT INTO dbo.DataTable (A, B, C, D, E, F)
VALUES (1, 2, 3, 11, 12, 13)
    , (4, 5, 6, 14, 15, 16)
    , (7, 8, 9, 17, 18, 19);

CREATE TABLE dbo.Table1
(
    Table1PK INT NOT NULL CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , A INT
    , B INT
    , C INT
);

CREATE TABLE dbo.Table2
(
    Table2PK INT NOT NULL CONSTRAINT PK_Table2 PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , Table1PK INT NOT NULL CONSTRAINT FK_Table2_Table1_PK FOREIGN KEY REFERENCES dbo.Table1(Table1PK)
    , D INT
    , E INT
    , F INT
);

ALTER TABLE dbo.DataTable ADD TempCol INT NOT NULL IDENTITY(1,1);

SET IDENTITY_INSERT dbo.Table1 ON;

INSERT INTO Table1 (Table1PK, A, B, C)
SELECT TempCol, A, B, C 
FROM DataTable;

SET IDENTITY_INSERT dbo.Table1 OFF;

INSERT INTO Table2 
SELECT Table1PK, D, E, F 
FROM dbo.DataTable DT
    INNER JOIN dbo.Table1 T ON DT.TempCol = T.Table1PK;

SELECT *
FROM dbo.Table1;

SELECT *
FROM dbo.Table2;

-1
INSERT INTO VouchersOtherDetail (
                                 [VouNo],
                                 [Location],
                                 [VouType],
                                 [VouDate],
                                 [InputDate],
                                 [CrossRefGoodsVouNo],
                                 [Reversed],
                                 [ReversalReference],
                                 [UserID]
                                 ) 
SELECT   
                                [VouNo],
                                [Location],
                                [VouType],
                                [VouDate],
                                [InputDate],
                                [CrossRefGoodsVouNo],
                                [Reversed],
                                [ReversalReference],
                                [UserID]
FROM @InsertTableForVoucherDetail           

INSERT INTO VouchersDrCrDetail (
                                [VouID],
                                [AccountCode],
                                [CrossReferAccountCode],
                                [Description],
                                [VouDrAmount],
                                [VouCrAmount],
                                [RunningBalance]
                               )
SELECT  -- IDENT_CURRENT to get the identity of row from previous insert
                                 IDENT_CURRENT('VouchersOtherDetail'), 
                                 [AccountCode],
                                 [CrossReferAccountCode],
                                 [Description],
                                 [VouDrAmount],
                                 [VouCrAmount],
                                 [RunningBalance]
FROM @InsertTableForDrAndCR

এই জিনিসটি আমার পক্ষে কাজ করেছিল, আমি এর খুব দেরিতে জবাব জানি তবে অন্যকে সাহায্য করতে পারে। আমি IDENT_CURRENTআগের সন্নিবেশ থেকে সারিটির পরিচয় পেয়েছি, তবে আমার জন্য এটি সর্বদা এক সারি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.