PDA

View Full Version : دستور sql



bebakhshid
شنبه 14 خرداد 1384, 08:25 صبح
سلام

من 3 تا table دارم که هرکدام چند field دارند .

من میخوام مقدار field ها را از کاربر بگیرم و با دستور insert هضافه کنم.

باید یه دستور insert بنویسم که اول 3تا table را join کنه و بعد اضافه کنه.

Insert را نیتوان join کرد error میگیره.

چه دستوری باید بنویسم

majid_afra222
شنبه 14 خرداد 1384, 08:53 صبح
سلام
اول اینکه 3 جدوا را با این شیوه که شما گفتید نمیشه insert کرد.
1- یه ویو برای نمایش اطلاعات جدول می سازید.
2- اطلاعات رو تو فرم از طریق اون ویو نشون می دید.
3- در ویو عمل insert رو انجام میدید.
4- و مهم تر اینکه٬‌یه تریگر از نوع instead of برای ویو می نویسید که عمل insert ٬ update و delete رو برای 3 تا جدول مدیریت کنه.

امیدوارم بدردت بخوره.

bebakhshid
شنبه 14 خرداد 1384, 09:07 صبح
یه نمونه کد .

اگر امکان داره

majid_afra222
شنبه 14 خرداد 1384, 13:04 عصر
سلام
این یه مثال از help خو sql server :


USE PUBS
GO
CREATE TABLE Person
(
SSN char(11) PRIMARY KEY,
Name nvarchar(100),
Address nvarchar(100),
Birthdate datetime
)
GO
CREATE TABLE EmployeeTable
(
EmployeeID int PRIMARY KEY,
SSN char(11) UNIQUE,
Department nvarchar(10),
Salary money,
CONSTRAINT FKEmpPer FOREIGN KEY (SSN)
REFERENCES Person (SSN)
)
GO
CREATE VIEW VEmployee AS
SELECT P.SSN as SSN, Name, Address,
Birthdate, EmployeeID, Department, Salary
FROM Person P, EmployeeTable E
WHERE P.SSN = E.SSN
GO
CREATE TABLE PersonDuplicates
(
SSN char(11),
Name nvarchar(100),
Address nvarchar(100),
Birthdate datetime,
InsertSNAME nchar(100),
WhenInserted datetime
)
GO
CREATE TRIGGER IO_Trig_INS_Employee ON VEmployee
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
-- Check for duplicate Person. If no duplicate, do an insert.
IF (NOT EXISTS (SELECT P.SSN
FROM Person P, inserted I
WHERE P.SSN = I.SSN))
INSERT INTO Person
SELECT SSN,Name,Address,Birthdate
FROM inserted
ELSE
-- Log attempt to insert duplicate Person row in PersonDuplicates table.
INSERT INTO PersonDuplicates
SELECT SSN,Name,Address,Birthdate,SUSER_SNAME(),GETDATE()
FROM inserted
-- Check for duplicate Employee. If no duplicate, do an insert.
IF (NOT EXISTS (SELECT E.SSN
FROM EmployeeTable E, inserted
WHERE E.SSN = inserted.SSN))
INSERT INTO EmployeeTable
SELECT EmployeeID,SSN, Department, Salary
FROM inserted
ELSE
--If duplicate, change to UPDATE so that there will not
--be a duplicate key violation error.
UPDATE EmployeeTable
SET EmployeeID = I.EmployeeID,
Department = I.Department,
Salary = I.Salary
FROM EmployeeTable E, inserted I
WHERE E.SSN = I.SSN
END
GO
SELECT * FROM PERSON
SELECT * FROM EmployeeTable
SELECT * FROM PersonDuplicates
GO
INSERT INTO VEmployee
VALUES ('1234', 'Majid', 'Tehran',
'10-DEC-1998', 1, 'SOFTWARE', 2000)
GO
SELECT * FROM PERSON
SELECT * FROM EmployeeTable
SELECT * FROM PersonDuplicates
GO

امیدوارم بدردت بخوره

tayebeh
دوشنبه 22 مرداد 1386, 14:38 عصر
با سلام
من جدیدا دارم درباره تریگرها مطالعه می کنم اگر سئوالم ابتدایی هست ببخشید . می خواستم بپرسم این کد بالا در query analayser امکان پذیره و کلا در اس کیو ال سرور انجام میشه . چطور میشه در برنامه نویسی ازش استفاده کرد؟یعنی نیازی به برنامه نویسی نداره خود اس کیو ال سرور تشخیص می ده که هنگام insert این تریگر رو فراخوانی کنه؟قضیه اش چطوری هست کلا؟
چطور میشه هنگام insert کردن مقادیر رو پاس داد به تریگر موردنظر؟
باتشکر

AminSobati
سه شنبه 23 مرداد 1386, 20:55 عصر
در حقیقت Triggerها برای جدول، مثل Eventها برای یک Object هستند، یعنی در پاسخ به یک عمل اجرا میشن. Trigger سمت دیتابیس نگه داری میشه و در کلاینت شما کاری باهاشون ندارین.
پارامتر یا مقدار به Trigger پاس نمیشه. در طول زمانی که یک Trigger داره اجرا میشه، جداول مجازی وجود دارند که با Query گرفتن از اونها متوجه تغییر میشین. مثلا در Trigger از نوع Insert، شما جدول مجازی Inserted دارین که حاوی یک کپی از رکورد (یا رکوردهای) در حال Insert هست.