PDA

View Full Version : سوال: تریگر ها و stored procedure ها در sqlexpress کار میکنند؟ و اینکه این دستور را چگونه بیان کنم؟



FVVSBN
دوشنبه 12 مهر 1389, 12:31 عصر
سلام.

آیا تریگر ها و stored procedure ها در sqlexpress کار میکنند؟

دستوری که میخوام توی تریگر بگم اینه:

بر روی insert ,delete,update کار کنه. (اینا رو میدونم)


idیی که insert,update,delete میخواد بشه رو در id1 بریز
تعداد رکورد هایی از جدول1 که idشون برابر id1 هست رو بریز در count1
insert into table2 (number) values (count1) where id=id1

بهزادصادقی
دوشنبه 12 مهر 1389, 14:39 عصر
بله کار می کنند و شما نباید مشکلی در انجام این کارها داشته باشی. همه کاملا قابل انجام به نظر می رسند. البته پیش فرض من این است که جدولی که این trigger ها را داری روش تعریف می کنی خود table2 نیست.

FVVSBN
دوشنبه 12 مهر 1389, 21:01 عصر
بله کار می کنند و شما نباید مشکلی در انجام این کارها داشته باشی. همه کاملا قابل انجام به نظر می رسند. البته پیش فرض من این است که جدولی که این trigger ها را داری روش تعریف می کنی خود table2 نیست.

بله. فرض شما کاملا درسته.

ضمن اینکه id نام فیلد هست و id1 , count1 متغییر.

حالا میشه لطف کنید بگید سینتکس دستوراتی که گفتم چی میشه؟

بهزادصادقی
دوشنبه 12 مهر 1389, 23:28 عصر
بله. فرض شما کاملا درسته.

ضمن اینکه id نام فیلد هست و id1 , count1 متغییر.

حالا میشه لطف کنید بگید سینتکس دستوراتی که گفتم چی میشه؟

لطفا ساختار دقیق جدول خود را اینجا درج کنید.

FVVSBN
سه شنبه 13 مهر 1389, 18:39 عصر
لطفا ساختار دقیق جدول خود را اینجا درج کنید.



مشکل قبلیم حل شد
حالا یه مشکل دیگه دارم:

این یه udf از نوع اسکالر هست:



USE [TaxiTell]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Whays_ID_Returner] (@tblName nvarchar(50))
RETURNS bigint
AS
BEGIN
-- Declare the return variable here
DECLARE @ID bigint
set @ID=1
while (exists (select ID from [@tblName] where ID=@ID))
set @ID+=1

RETUrn (@id)
END



و نحوه فراخوانی اونو تو برنامه اینجوری نوشتم (c#):





public string ID_Finder(string tblNAme)
{
SqlDataAdapter objDataAdapter = new SqlDataAdapter("select * from Whays_ID_Returner(@"+tblNAme+")", strConnectionString);
string strNewId="";
DataSet objDataSet = new DataSet();
objDataAdapter.Fill(objDataSet);
strNewId = objDataSet.Tables[0].Rows[0][0].ToString();
return strNewId;
}






خطایی که میده اینه: (tblDriver نام جدول مورد نیاز هست.)



"متغیر اسکالر @tblName باید تعریغ شود"

Must declare the scalar variable "@tblDrivers".

بهزادصادقی
سه شنبه 13 مهر 1389, 21:45 عصر
شما چند تا مشکل اینجا داری.

اولا در SQL Server نمی شود این کار را کرد:



select ID from [@tblName]

باید حتما اسم جدول تایپ شده باشد. نمی توانید به جای ذکر اسم یک چدول، از یک متغیر استفاده کنید.

دوما این که برای انجام این کار:



select * from Whays_ID_Returner(

function شما باید یک table بر گرداند، نه یک scalar، چون شما دارید جای یک جدول ازش استفاده می کنید

سوم اینکه به نطر من می رسد که دستور while ای که در درون function خود دارید یک حلقه بی نهایت است. یعنی به نظر می رسد که اگر یک بار اجرا شد، همیشه اجرا خواهد شد و شما هیچ وقت ازش در نخواهید آمد.

FVVSBN
سه شنبه 13 مهر 1389, 23:06 عصر
ابتدا از همه کمکاتون واقعا ممنون آقای صادقی.


شما چند تا مشکل اینجا داری.

اولا در SQL Server نمی شود این کار را کرد:



select ID from [@tblName]

باید حتما اسم جدول تایپ شده باشد. نمی توانید به جای ذکر اسم یک چدول، از یک متغیر استفاده کنید.


گفتم شاید بشه، که اگر میشد، نیازی به نوشتن یک تابع برای هر جدول نبود، و میشد برای همه جدول ها از این استفاده کنم.




دوما این که برای انجام این کار:



select * from Whays_ID_Returner(

function شما باید یک table بر گرداند، نه یک scalar، چون شما دارید جای یک جدول ازش استفاده می کنید
.


چجوری حل میشه؟

select id from Whays_ID_Returner
حلش میکنه؟

edit: اینجوری حل نشد



سوم اینکه به نطر من می رسد که دستور while ای که در درون function خود دارید یک حلقه بی نهایت است. یعنی به نظر می رسد که اگر یک بار اجرا شد، همیشه اجرا خواهد شد و شما هیچ وقت ازش در نخواهید آمد.


نه بی نهایت نیست.

این حلقه یه الگوریتمیه که خودم برای انتخاب اتوماتیک شماره (id) انتخاب کردم.

میگه شمارشگر رو 1 قرار بده... تا وقتی که idیی مساوی شمارشگر وجود داشت شمارشگر رو یکی زیاد کن.

حالا اگه وجود نداشت شمارشگر رو برگردون.

بهترین ویژگی این الگوریتم اینه که به جای انتخاب بزرگترینid یکی بیشتر، میاد اولین جای خالی رو به عنوان id جدید انتخاب میکنه.

بهزادصادقی
چهارشنبه 14 مهر 1389, 02:26 صبح
شاید چیزی که دنبالش هستید این است؟


select Whays_ID_Returner(...)

FastCode
چهارشنبه 14 مهر 1389, 06:43 صبح
select ID from [@tblName]
این رو میتونید با sp_exec درست کنید:

sp_exec('select ID from ' + [@tblName])
بقیه رو اصلاً نفهمیدم.:گیج:

FVVSBN
چهارشنبه 14 مهر 1389, 18:45 عصر
آقای بهزادصادقی ممنون. مشکلم حل شد.


این رو میتونید با sp_exec درست کنید:

sp_exec('select ID from ' + [@tblName])
بقیه رو اصلاً نفهمیدم.:گیج:
ممنون از وقتی که میذارید.
میشه بیشتر توضیح بدید.

FastCode
چهارشنبه 14 مهر 1389, 19:41 عصر
میشه بیشتر توضیح بدید.
بله.
با این sp شما میتونید هر کدی رو که میخواهید اجرا کنید و نتیجش رو بگیرید.
در واقع به جای select کردن اسم جدول شما باید دستور select اون جدول رو اجرا کنید.
ببخشید من الان یه مقدار مریضم دستهام جون نداره.