# پایگاه‌های داده > SQL Server > سوال: تریگر ها و stored procedure ها در sqlexpress کار میکنند؟ و اینکه این دستور را چگونه بیان کنم؟

## FVVSBN

سلام.

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

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

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

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

----------


## بهزادصادقی

بله کار می کنند و شما نباید مشکلی در انجام این کارها داشته باشی. همه کاملا قابل انجام به نظر می رسند. البته پیش فرض من این است که جدولی که این trigger ها را داری روش تعریف می کنی خود table2 نیست.

----------


## FVVSBN

> بله کار می کنند و شما نباید مشکلی در انجام این کارها داشته باشی. همه کاملا قابل انجام به نظر می رسند. البته پیش فرض من این است که جدولی که این trigger ها را داری روش تعریف می کنی خود table2 نیست.


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

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

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

----------


## بهزادصادقی

> بله. فرض شما کاملا درسته.
> 
> ضمن اینکه id نام فیلد هست و id1 , count1 متغییر.
> 
> حالا میشه لطف کنید بگید سینتکس دستوراتی که گفتم چی میشه؟


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

----------


## FVVSBN

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


 

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

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


USE [TaxiTell]
GO
 
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
ALTERFUNCTION [dbo].[Whays_ID_Returner](@tblName nvarchar(50))
RETURNSbigint
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#‎):



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





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

 
"متغیر اسکالر @tblName باید تعریغ شود"
 
Must declare the scalar variable "@tblDrivers".

----------


## بهزادصادقی

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

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


select ID from [@tblName]

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

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


select * from Whays_ID_Returner(

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

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

----------


## FVVSBN

ابتدا از همه کمکاتون واقعا ممنون آقای صادقی.




> شما چند تا مشکل اینجا داری.
> 
> اولا در 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 جدید انتخاب میکنه.

----------


## بهزادصادقی

شاید چیزی که دنبالش هستید این است؟

select Whays_ID_Returner(...)

----------


## FastCode

> select ID from [@tblName]


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

----------


## FVVSBN

آقای بهزادصادقی ممنون. مشکلم حل شد.




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


 ممنون از وقتی که میذارید.
میشه بیشتر توضیح بدید.

----------


## FastCode

> میشه بیشتر توضیح بدید.


بله.
با این sp شما میتونید هر کدی رو که میخواهید اجرا کنید و نتیجش رو بگیرید.
در واقع به جای select کردن اسم جدول شما باید دستور select اون جدول رو اجرا کنید.
ببخشید من الان یه مقدار مریضم دستهام جون نداره.

----------

