-
نوشتن کوئری از دو جدول متفاوت
سلام
من دو جدول دارم یکی جدول امور و دیگری جدول مشترک حالا میخوام کوئری insert رو طوری بنویسم که هر مشترک فقط یک امور داشته باشه و اگر مشترکی خواست دو امور داشته باشه پیغام خطا بده
چکار باید بکنم؟
فیلدهای جدول امور: cid,name,family,address
فیلدهای جدول مشترک: Id,cid,cname,cfamily,caddress
ممنون از تمامی دوستان.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
درود بر شما
اندکی صبر میکردین همونجا جواب میدادن دوستان:اشتباه:
اگر دیتابیستون رو بگید چیه بهتر راهنمایی می کنم.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
سلام
SQL server 2012
نام دیتابیس: testDB
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
خیلی خیل راحته
شما در جدول مشترک دو فیلد id و cid رو به عنوان primary key تعریف کنید. با query اینجور میشه البته هنگام تعریف جدول:
Constraint PK_table1 PRIMARY KEY(ClassID, StudentID)
اگر از wizard می خواید استفاده کنید. روی table راست کلیک، design و بعد دوتا ستون روی انتخاب کنید و روی دکمه set as primary key کلیک کنید و save کنید.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
آقای بیضاوی منظورم این نبود، منظورم این بود که cid در جدول امور، کلید خارجی در جدول مشترک(cid) هست حالا من میخوام کوئری insert رو طوری هندل کنم که وقتی در جدول مشترک insert انجام میشه همون اطلاعات یعنی نام و نام خانوادگی و آدرس در جدول امور با توجه به cid هاشون انجام بشه. اگه میشه کوئری insert رو بهم بگین چطوری بنویسم؟
ممنون از لطفتون.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
نمیدونم درست متوجه شدم یا نه
اما طبق فرموده شما راه حل استفاده از Triger هست البته روی همون جدول امور. فک کنم اینجور بشه:
ALTER TRIGGER [dbo].[InsertIntoMoshtarak] ON [dbo].[Omoor]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- get the last id value of the record inserted or updated
DECLARE @id INT
DECLARE @name varchar(50)
DECLARE @family varchar(50)
DECLARE @address varchar(50)
SELECT @id = [cid], @name=[name], @family=[family], @address=[address]
FROM INSERTED
INSERT INTO(cid,cname,cfamily,caddress)
VALUES @id,@name,@family,@address;
END
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
این تریگری که شما نوشتین رو ارور میگیره.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
نقل قول:
نوشته شده توسط
manit44
این تریگری که شما نوشتین رو ارور میگیره.
من دیتابیس ندارم.
همینجور نوشتم، errorش چیه؟؟؟
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
Msg 102, Level 15, State 1, Procedure InsertIntoCustomer, Line 21Incorrect syntax near '('.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
دوستان عزیز یه کمکی کنند!!!!!!!!!!!!
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
اوه اوه ببخشید.
بین INTO و پرانتز باز اسم جدول مشترک رو بذار
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
حالا یه ارور دیگه داد:
Msg 102, Level 15, State 1, Procedure InsertIntoMoshtarak, Line 22
Incorrect syntax near '@id'.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
دارم SQL نصب میکنم.
اینو امتحان کن فک کنم این درستره تا نصب بشه خودمم چک کنم.:
ALTER TRIGGER [dbo].[InsertIntoMoshtarak] ON [dbo].[Omoor]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- get the last id value of the record inserted or updated
DECLARE @id INT;
DECLARE @name varchar(50);
DECLARE @family varchar(50);
DECLARE @address varchar(50);
SET @id = o.id from insertted o;
SET @name = o.name from insertted o;
SET @family = o.family from insertted o;
SET @address = o.address from insertted o;
INSERT INTO(cid,cname,cfamily,caddress)
VALUES @id,@name,@family,@address;
END
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
ارورش بیشتر شد که کمتر نشد.:عصبانی++:
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
CREATE TRIGGER [dbo].[InsertIntoMoshtarak] ON [dbo].[Omoor]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
insert into moshtarak (cid,cname,cfamily,caddress)
(select cid,name,family,address from omoor where id=@@IDENTITY)
END
GO
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
این قسمت فکر کنم باید cid باشه:
cid=@@IDENTITY)
درسته؟
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
نه، اگر Id جدول omoor به صورت identity باشه با این کوئری آخرین رکورد insert شده رو که id اون با همین@@Identity برابره واکشی میکنه.
فکر میکنم همین درسته. نیست؟
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
میبخشید میدونم اینجا جاش نیست ولی خیلی واجبه
تو برنامم یعنی C# وقتی تریگرم رو صدا میزنم با ارور زیر مواجه میشم:
The request for procedure 'trg_customer' failed because 'trg_customer' is a trigger object.
اینم کدمه:
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=testDB;Integrated Security=True"); con.Open();
SqlCommand cmd = new SqlCommand("trg_customer", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1 = new SqlParameter("cname", txtName.Text);
SqlParameter p2 = new SqlParameter("cfamily", txtFamily.Text);
SqlParameter p3 = new SqlParameter("caddress", txtAddress.Text);
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.ExecuteNonQuery();
con.Close();
Label4.Text = "اطلاعات با موفقیت ثبت شد";
GridView1.DataBind();
خیلی ممنون.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
نقل قول:
نوشته شده توسط
manit44
میبخشید میدونم اینجا جاش نیست ولی خیلی واجبه
تو برنامم یعنی C# وقتی تریگرم رو صدا میزنم با ارور زیر مواجه میشم:
The request for procedure 'trg_customer' failed because 'trg_customer' is a trigger object.
اینم کدمه:
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=testDB;Integrated Security=True"); con.Open();
SqlCommand cmd = new SqlCommand("trg_customer", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1 = new SqlParameter("cname", txtName.Text);
SqlParameter p2 = new SqlParameter("cfamily", txtFamily.Text);
SqlParameter p3 = new SqlParameter("caddress", txtAddress.Text);
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.ExecuteNonQuery();
con.Close();
Label4.Text = "اطلاعات با موفقیت ثبت شد";
GridView1.DataBind();
خیلی ممنون.
به به، به به....:تشویق:
trigger رو که شما یا توی برنامه صدا نمیزنن، trigger آخرین station قبل از اعمال داده ها روی دیسک سخت افزاری هست و فقط engine دیتابیش اون رو handle می کنه.
از اون گذشته خودتون که میبینید type دستورتون رو storedprocedure گذاشتین چرا می خواید یه کار دیگه باهاش انجام بدین؟؟؟
راستی به trigger پارامتر هم نمیتونید پاس بدید
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
پس میتونم همون کد sql ای که در بالا برام گذاشتین قرارش بدم داخل یک پروسیجر؟
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
برای اینکه این کد رو بزارین توی sp و درست هم جواب بگیرید حداقلش اینه که Id رو باید بهش پاس بدین
اما یه نکته؛ همون trigger که تمام کارتون بدون ذره ای کد نوشتن در سمت برنامه انجام میده. پس چرا میخواید اینکار رو انجام بدید؟؟؟؟!!!!!!:متفکر:
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
ببینید من پروسیجرم رو به این شکل نوشتم ولی این ارور را گرفت:
کد:
USE [testDB]GO
/****** Object: StoredProcedure [dbo].[sp_customer] Script Date: 2014-09-18 1:25:47 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_customer]
AS
BEGIN
-- Insert statements for procedure here
SET NOCOUNT ON;
insert into tbl_customer(cid,cname,cfamily,caddress)
(select cid,name,family,address from tbl_omoor where cid=@@IDENTITY)
END
ارور:
Procedure sp_customer has no parameters and arguments were supplied.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
شما اینجا یه پارامتر دارید که ناشناختست و اون @@IDENTITY هست.
این متغیر در زمان باز بودن connection هنگام INSERT شناخته میشه و اینجا معنی نداره.
شما همین متغیر رو به صورت پارامتر ورودی به این sp پاس بدید و بعد همین پارامتر رو بزارید جای @@IDENTITY.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
ببینید الان درست شد؟
کد:
ALTER PROCEDURE [dbo].[sp_customer]@Id int
AS
BEGIN
-- Insert statements for procedure here
SET NOCOUNT ON;
insert into tbl_customer(cid,cname,cfamily,caddress)
(select cid,name,family,address from tbl_omoor where cid=@Id)
END
اگه درسته تو سی شارپ باید چطوری ازش استفاده کنم؟
ممنون.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
یه سوال اگه بخوام این sp رو مستقیما تو سی شارپ بکار ببرم، میتونم این کار رو انجام بدم؟
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
درسته، فقط بهتره اینجا دیگه پرانتز اول و آخر select رو برداری.
برای سی شارپ هم قبلا کدش رو نوشته بودی که. اینجوری:
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=testDB;Integrated Security=True");
SqlCommand cmd = new SqlCommand("sp_customer", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1 = new SqlParameter("Id", txtId.Text);
cmd.Parameters.Add(p1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
Label4.Text = "اطلاعات با موفقيت ثبت شد";
GridView1.DataBind();
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
نقل قول:
نوشته شده توسط
manit44
یه سوال اگه بخوام این sp رو مستقیما تو سی شارپ بکار ببرم، میتونم این کار رو انجام بدم؟
مگه به صورت کج هم داریم!!! آره دیگه همینجور که استفاده کردی و منم تکرارش کردم
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
آقای بیضاوی پیام موفقیت آمیز ثبت اطلاعات رو داد ولی چیزی داخل دیتابیس ثبت نکرد. چکار کنم؟
ممنون.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
از داخل SQL یا توی VS یک کوئری باز کن و اون sp رو با مقداری که می دونی توی جدول هست امتحان کن . فرض کن Id شماره 4 رو داری:
EXEC sp_customer @id=4;
ببین اجرا میشه با نه؟ چی پیام میده؟
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
بله درست اجرا میشه داخل SQL server، ولی وقتی برنامه رو تو ویژوال استودیو اجرا میکنم و فیلدها رو پر میکنم هیچ دیتایی ثبت نمیکنه ولی پیام موفقیت آمیز میده. چکار کنم که از داخل برنامه هم دیتا ثبت کنه؟
ممنون.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
می تونید یه break point روی این خط زیر بذارید ببینید مقدار p1 ارجاعی به sp چیه:
con.Open();
احتمالا این مقدار یا خالیه و یا یه مقدار نادرست که توی جدول نیست رو میگیره.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
مقدار p1 رو null میده. باید چطوری پرش کنم؟ چون تو sql درست جواب میده.
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
این دوتا خظ رو پاک کن :
SqlParameter p1 = new SqlParameter("Id", txtId.Text);
cmd.Parameters.Add(p1);
از این بجاش استفاده کن ببین اکی میشه:
cmd.Parameters.AddWithValue("Id", txtId.Text);
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
یعنی بازم مقدار پارامتر خالیه؟
اصلا ببین مقداری که میخوای بزاری جای Id پر میشه؟ مقدارش چیه؟!!!:متعجب:
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
بله باز هم مقدار پارامتر خالیه
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
نه، گفتم ببین مقدار پارامتری که میخوای بریزی داخل پارامتر چیه، اون یه مشکلی داره نه پارامتره!!!:عصبانی:
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
اون رو هم null بزمیگردونه
-
نقل قول: نوشتن کوئری از دو جدول متفاوت
آقا صبح شد
کد این صفحه رو بذار ببینم Id رو چطور داری میگیری و به اینجا میرسونی:افسرده: