View Full Version : insert به وسیله کد نویسی
raheleh_es
چهارشنبه 27 مرداد 1389, 17:12 عصر
سلام دوستان
آیا کسی میدونه 2 جدولی که با relation با هم در ارتباط هستند چطوری در Run Time میتونیم داده به 2 جدول اضافه کنیم؟؟؟؟
آیا برای هر کدام جدا باید کوئری نوشت؟؟؟؟؟؟؟؟؟؟؟؟
m_omrani
پنج شنبه 28 مرداد 1389, 00:52 صبح
من شخصاً براي جدول پدر يک کليد IDENTITY مي گيرم و اونو در جدول فرزند، FOREIGN KEY مي کنم. براي درج دو رکورد پشت سر هم، يکي در پدر و ديگري در فرزند، از SPROC استفاده مي کنم. ابتدا يک رکورد در جدول پدر درج مي کنم و با SCOPE_IDENTITY() کليد اونو به دست ميارم و بعد اين مقدار رو براي فيلد FK در جدول فرزند استفاده مي کنم.
فقط دقت کنيد در اين حالت حتماً از تراکنش (TRANSACTION) استفاده کنيد تا در صورت وقوع هر گونه خطا، بتونيد کل عمليات رو ROLLBACK کنيد تا هيچ کدوم از رکوردها درج نشه و رکورد اضافي تو پايگاه داده تون نداشته باشيد.
مثال:
جدول A: سفارش (Order)
OrderID: IDENTITY (PK)
OrderDate: DATETIME
UserID: INT
جدول B: اقلام سفارش (Order_Details)
OrderDetailID: IDENTITY
OrderID: INT (FK)
ProductID: INT (FK)
Quantity: INT
Unit: TINYINT
جدول C: کالا (Product)
ProductID: IDENTITY (PK)
Title: NVARCHAR(200)
Code: SMALLINT
روال لازم براي درج سفارش يک کالا
CREATE PROC up_Order_add(@ProductCode SMALLINT,@UserID INT, @Quantity INT, @Unit TINYINT) AS
BEGIN
DECLARE @OrderID INT
DECLARE @ProductID INT
BEGIN TRY
BEGIN TRAN trn1
INSERT INTO Order(OrderDate,UserID) VALUES (GETDATE(),@UserID)
SET @OrderID = SCOPE_IDENTITY()
SELECT @ProductID = ProductID FROM Product WHERE Code = @ProductID
INSERT INTO Order_Details(OrderID,ProductID,Quantity) VALUES (@OrderID,@ProductID,@Quantity, @Unit)
COMMIT TRAN trn1
END TRY
BEGIN CATCH
ROLLBACK TRAN trn1
END CATCH
END
AminSobati
پنج شنبه 28 مرداد 1389, 00:54 صبح
سلام دوست عزیزم،
دستورات ویرایشی در آن واحد روی یک جدول تاثیر میگذارند مگر اینکه Trigger در میان باشه.
محمد سلیم آبادی
پنج شنبه 28 مرداد 1389, 01:04 صبح
سلام،
البته با کمک بهبودی که در نسخه 2008 ایجاد شده است می توانیم با یک عبارت/دستور داده های موجود در چند جدول را مورد تغییر قرار دهیم.
با کمک ماده ی OUTPUT در عبارت MERGE (و سایر دستورات) این کار امکان پذیر هست. برای مثال به اینجا مراجعه شود:
http://pratchev.blogspot.com/2008/04/composable-dml.html
یا مثال از Book Online:
USE AdventureWorks;
GO
IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL
DROP TABLE Production.ZeroInventory;
GO
--Create ZeroInventory table.
CREATE TABLE Production.ZeroInventory (ProductID int);
GO
INSERT INTO Production.ZeroInventory (ProductID)
SELECT ProductID
FROM
( MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = '20030401'
GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)
WHERE Action = 'DELETE';
GO
SELECT ProductID FROM Production.ZeroInventory;
m_omrani
پنج شنبه 28 مرداد 1389, 10:50 صبح
يه چيزي رو در مورد روال up_Order_add فراموش کردم:
حنماً بعد از اين که سعي کرديد کُد ProductID مرتبط با ProductCode رو با جستجو به دست بياريد، بعدش با ISNULL() چک کنيد که NULL نباشه و بعد اگه NULL بود يه مقدار نامعتبر در متغير @ProductID قرار بديد. مثلاً اين طوري:
SELECT @ProductID = ProductID FROM Product WHERE Code = @ProductID
SET @ProductID = ISNULL(@ProductID, 0)
علت اين کار اينه که وقتي دستور بعدي مي خواد اجرا بشه و جزئيات سفارش رو بر اساس سفارشي که الان درج کرديد ثبت کنه، خطا بده (چون هيچ کالايي که ProductID اون صفر باشه وجود نداره).
دستورات ویرایشی در آن واحد روی یک جدول تاثیر میگذارند مگر اینکه Trigger در میان باشه.
علت اين که گفتم حتماً از TRANSACTION استفاده بشه، از جنبه منطق کسب و کار (Business Logic) بود. به اين دليل که عمليات به صورت اتمي اجرا بشه. يعني يا هيچ سفارشي ثبت نشه، يا درست ثبت بشه.
در غير اين صورت اگه مثلاً روال up_Order_add اي که نوشتم رو با @ProductCode اي اجرا کنيم که کُد او کالا در جدول Product وجود نداره و در واقع کالايي با کُد مشخص شده وجود نداره، سفارش ثبت ميشه ولي جزئيات سفارش ثبت نمي شه. اين باعث مي شه يه سري رکورد سفارش خالي ايجاد بشه که هيچ کالايي نداره.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.