PDA

View Full Version : مشکل این کد تریگر چیست؟



بمب منطقی
یک شنبه 10 اردیبهشت 1391, 12:24 عصر
با سلام خدمت اساتید sql با توجه به مباحث این بخش متن کد زیر رو بر روی جدول فرضی asnad اجرا میکنم که با توجه به جدول فرضی customers مقادیری رو در جدول main اضافه میکنه.ولی این کد سراپا دارای اشکال است لطفا کد زیر رو اصلاح کنید.با تشکر
CREATE TRIGGER sen4sms ON [dbo].[asnad]
FOR INSERT, UPDATE
AS
BEGIN
DECLARE
@fname VARCHAR(100),
@t1 VARCHAR(100),
@t2 VARCHAR(100),
@t3 VARCHAR(100),
@t1c VARCHAR(100),
@t2c VARCHAR(100),
@t3c VARCHAR(100),
@m VARCHAR(100),
@dd VARCHAR(100),
@tt VARCHAR(100),
@tn VARCHAR(100),
@dn VARCHAR(100),
@t VARCHAR(100)

select fname=Fullname from Customers where Customers.custno=inserted.p_code
select t1=Tel1 from Customers where Customers.custno=inserted.p_code
select t2=Tel2 from Customers where Customers.custno=inserted.p_code
select t3=Tel3 from Customers where Customers.custno=inserted.p_code
select t1c=Tel1Caption from Customers where Customers.custno=inserted.p_code
select t2c=Tel2Caption from Customers where Customers.custno=inserted.p_code
select t3c=Tel3Caption from Customers where Customers.custno=inserted.p_code

select m=mab from inserted where Customers.custno=p_code
select dd=dar_date from inserted where Customers.custno=p_code
select tt=type_t from inserted where Customers.custno=p_code
select tn=type_no from inserted where Customers.custno=p_code
select dn=doc_no from inserted where Customers.custno=p_code
select t=tavasot from inserted where Customers.custno=p_code

insert into report.dbo.main values(@fname,
@t1,
@t2,
@t3,
@t1c,
@t2c,
@t3c,
@m,
@dd,
@tt,
@tn,
@dn,
@t)
END

crazy coder
یک شنبه 10 اردیبهشت 1391, 16:35 عصر
سلام
شما که لطف کردی و این تاپیک رو زدی...یه زحمت بکش و کد خطایی رو که میده رو هم بنویس تا راحتر تر کمک کنیم....

SReza1
یک شنبه 10 اردیبهشت 1391, 17:00 عصر
با سلام خدمت اساتید sql با توجه به مباحث این بخش متن کد زیر رو بر روی جدول فرضی asnad اجرا میکنم که با توجه به جدول فرضی customers مقادیری رو در جدول main اضافه میکنه.ولی این کد سراپا دارای اشکال است لطفا کد زیر رو اصلاح کنید.با تشکر
CREATE TRIGGER sen4sms ON [dbo].[asnad]
FOR INSERT, UPDATE
AS
BEGIN
DECLARE
@fname VARCHAR(100),
@t1 VARCHAR(100),
@t2 VARCHAR(100),
@t3 VARCHAR(100),
@t1c VARCHAR(100),
@t2c VARCHAR(100),
@t3c VARCHAR(100),
@m VARCHAR(100),
@dd VARCHAR(100),
@tt VARCHAR(100),
@tn VARCHAR(100),
@dn VARCHAR(100),
@t VARCHAR(100)

select fname=Fullname from Customers where Customers.custno=inserted.p_code
select t1=Tel1 from Customers where Customers.custno=inserted.p_code
select t2=Tel2 from Customers where Customers.custno=inserted.p_code
select t3=Tel3 from Customers where Customers.custno=inserted.p_code
select t1c=Tel1Caption from Customers where Customers.custno=inserted.p_code
select t2c=Tel2Caption from Customers where Customers.custno=inserted.p_code
select t3c=Tel3Caption from Customers where Customers.custno=inserted.p_code

select m=mab from inserted where Customers.custno=p_code
select dd=dar_date from inserted where Customers.custno=p_code
select tt=type_t from inserted where Customers.custno=p_code
select tn=type_no from inserted where Customers.custno=p_code
select dn=doc_no from inserted where Customers.custno=p_code
select t=tavasot from inserted where Customers.custno=p_code

insert into report.dbo.main values(@fname,
@t1,
@t2,
@t3,
@t1c,
@t2c,
@t3c,
@m,
@dd,
@tt,
@tn,
@dn,
@t)
END


بمب منطقي عزيز!
مشكل كدت تابلو است شما بايد در select كه استفاده كردي به شكل زير بنويسي:


select @t1=Tel1 from Customers where Customers.custno=inserted.p_code


نه اين كد



select t1=Tel1 from Customers where Customers.custno=inserted.p_code

متغير t1 بايد باشد نه خود t1. جاهاي ديگر هم فكر كنم همين مشكل را داري. در ضمن بهتره حداقل يك print screen از ايرادت بذاري تا راحتتر بشه مشكلت رو رصد كرد.

بمب منطقی
دوشنبه 11 اردیبهشت 1391, 09:23 صبح
مشکل به طریقی که گفتین حل نشد اینم پیغام خطا:

SReza1
دوشنبه 11 اردیبهشت 1391, 09:59 صبح
مشکل به طریقی که گفتین حل نشد اینم پیغام خطا:

يك اسكربپت از database بذار. حلش ميكنيم. البته اون چيزي كه نوشتم درست بود و بايد از متغير استفاده ميكردي.
حدس ميزنم اگر اين where را با join شبيه‌سازي كني حل ميشه. نميدونم. بايد بانكت رو ببينم چه مرگشه. اون موقع ميشه نظر دقيق داد. براي همين اسكربپت از database بذار.
البته يك نكته درست هم آقاي صادقيان گفته (در پستها پايين) كه بحث همون join است. شما بايستي براي استفاده از جدوال سيستمي inserted و deleted حتما خود اونها را در بخش from استفاده كني و يا حتما بايستي join استفاده كني. چون اين tableها هم مثل ساير جداول براي استتفاده ازشون بايد يا join بزني يا select
مثلا :‌


select @t1=Tel1 from Customers where Customers.custno=inserted.p_code



بايستي بشه :


select @t1=Tel1 from Inserted
inner join Customers ON Customers.custno=inserted.p_code


در ضمن اگر چند ركورد همزمان پاك شه و يا Insert بشه (در يك Batch ) تريگر شما مشكل ميخوره. (چون مقدار Tel1 بيش از يك مقدار برميگردونه) كه بديهي است SQL Server آخريشو در متغير T1 ميذاره

crazy coder
دوشنبه 11 اردیبهشت 1391, 10:39 صبح
شما تریگر رو جدول sen4sms نوشتی. درسته؟ خوب تو این جدول شما ستونی به نام p_code داری؟

حمیدرضاصادقیان
دوشنبه 11 اردیبهشت 1391, 12:51 عصر
سلام.
دوست عزیز باید شما با جدول Inserted اول یک Join انجام بدید بعد در Where ازش استفاده کنید. خواهش میکنم مطالب موجود در تریگر روی سایت رو بخونید خودتون متوجه ایرادتون می شوید. شما بدون اینکه از جدول Inserted در Select,From استفاده کنید دارید مستقیم توی Where ازش استفاده میکنید که هیچ مفهومی برای SQL Server نداره.پیغامش هم داره میگه که این پیشوند شناخته شده نیست چون پیشوندها باید در عبارت From شما جلوی نام جدول مشخص بشه تا بتونید ازش جاهای دیگه استفاده کنید.

بمب منطقی
دوشنبه 11 اردیبهشت 1391, 15:31 عصر
واقعا از بابت پیغام زیبای زیر از همتون ممنونم.مشکل از همون join بود که آقایان SRZA و حمیدرضا صادقیان فرمودند و کد رو بشکل زیر تغییر دادم.و جواب آقای crazy coder خیره چون تریگر داره روی جدول asnad گذاشته میشه.مشکلم حل شد.خدا مشکلاتتون رو تو زندگیتون حل کنه.

CREATE TRIGGER sen4sms ON [dbo].[asnad]
FOR INSERT, UPDATE
AS
BEGIN
DECLARE
@fname VARCHAR(100),
@t1 VARCHAR(100),
@t2 VARCHAR(100),
@t3 VARCHAR(100),
@t1c VARCHAR(100),
@t2c VARCHAR(100),
@t3c VARCHAR(100),
@m VARCHAR(100),
@dd VARCHAR(100),
@tt VARCHAR(100),
@tn VARCHAR(100),
@dn VARCHAR(100),
@t VARCHAR(100)

select @fname=Fullname,
@t1=Tel1,
@t2=Tel2,
@t3=Tel3,
@t1c=Tel1Caption,
@t2c=Tel2Caption,
@t3c=Tel3Caption,
@m=mab,
@dd=dar_date,
@tt=type_t,
@tn=type_no,
@dn=docno,
@t=tavasot from Inserted inner join Customers ON Customers.custno=inserted.p_code

insert into sms_report.dbo.main values ( @fname,
@t1,
@t2,
@t3,
@t1c,
@t2c,
@t3c,
@m,
@dd,
@tt,
@tn,
@dn,
@t)
END