PDA

View Full Version : مشکل در نوشتن function



resident
شنبه 06 بهمن 1386, 17:05 عصر
سلام.
من میخوام تابعی بنویسم که نام جدول و نام فیلدی از اون جدول که جستجو بر اساس اون انجام میشه و مقدار اون فیلد رو بگیره و جستجو کنه . اگه پیدا کرد true یا 1 و در صورتی که پیدا نکرد false یا صفر برگردونه. من تابع زیر رو نوشتم ولی 3 تاerror می گیره.




create function search_pk(@tblname table,@fieldname nvarchar(30),@value nvarchar(20))
returns bit
as
begin
if exists(select * from @tblname where @fieldname=@value)
return true
else
return false
end



اینم error ها :




Server: Msg 137, Level 15, State 1, Procedure search_pk, Line 5
Must declare the variable '@tblname'.
Server: Msg 178, Level 15, State 1, Procedure search_pk, Line 7
A RETURN statement with a return value cannot be used in this context.
Server: Msg 178, Level 15, StatA RETURN statement with a return value cannot be used in this context.
e 1, Procedure search_pk, Line 9



لطفا راهنماییم کنید.

resident
شنبه 06 بهمن 1386, 22:38 عصر
از اساتید عزیز کسی جواب نمیده؟

حمیدرضاصادقیان
یک شنبه 07 بهمن 1386, 08:12 صبح
سلام.ظاهرا در داخل تابع شما نمیتونی از dynamic sql استفاده کنی. شما وقتی نام جدول رو به این صورت پاس میکنی خطا میده.خوب شما برای اینکارت چرا از sp استفاده نمیکنی.یک Sp بنویس بعد فقط یک فیلد از جدولت رو انتخاب کن و فقط هم یک ردیف از اون رو برگردون.در برنامه ات مقدارش رو چک کن اگر تعداد رکوردها یکی بود که یعنی جواب داره اگر صفر بود که یعنی جواب نداره.در ضمن خود sp نیز پارامتر خروجی داره حتی از اون هم میتونی استفاده کنی.بعد در sp شما میتونی از dynamic sql استفاده کنی.با استفاده از دستور sp_executesql.
موفق باشید.

resident
سه شنبه 09 بهمن 1386, 12:45 عصر
سلام.ظاهرا در داخل تابع شما نمیتونی از dynamic sql استفاده کنی. شما وقتی نام جدول رو به این صورت پاس میکنی خطا میده.خوب شما برای اینکارت چرا از sp استفاده نمیکنی.یک Sp بنویس بعد فقط یک فیلد از جدولت رو انتخاب کن و فقط هم یک ردیف از اون رو برگردون.در برنامه ات مقدارش رو چک کن اگر تعداد رکوردها یکی بود که یعنی جواب داره اگر صفر بود که یعنی جواب نداره.در ضمن خود sp نیز پارامتر خروجی داره حتی از اون هم میتونی استفاده کنی.بعد در sp شما میتونی از dynamic sql استفاده کنی.با استفاده از دستور sp_executesql.
موفق باشید.
آقای صادقیان ممنون از راهنماییتون.
من این کار رو با SP بصورت زیر نوشتم Error نداشت.


create procedure search_field @tblname nvarchar(40),
@field_name nvarchar(50),@value nvarchar(40)
as
declare @selectstring nvarchar(200)
declare @rowcount int
set @selectstring='select @@rowcount'+
' from @tblname'+
' where @fieldname=@value'
set @rowcount=@@rowcount
exec sp_executesql @selectstring,@rowcount,@tblname,@field_name,@valu e

اما وقتی میخوام اجراش کنم error میده


declare @tblname nvarchar(40)
declare @field_name nvarchar(50)
declare @value nvarchar(40)
set @tblname='pishnahade_tarh'
set @field_name='code_pishnahade_tarh'
set @value='0011'
exec search_field @tblname,@field_name,@value


اینم Error که من فکر نمی کنم مشکلی باشه:


Server: Msg 214, Level 16, State 3, Procedure sp_executesql, Line 11
Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'.

حمیدرضاصادقیان
سه شنبه 09 بهمن 1386, 13:36 عصر
سلام.فکر میکنم باید به این شکل بنویسی.
(راستی خطا داره از پارامتر parameters@ خطا میگیره در صورتیکه اصلا این پارامتر وجود ندارد)



create procedure search_field @tblname nvarchar(40),
@field_name nvarchar(50),@value nvarchar(40)
as
declare @selectstring nvarchar(200)
declare @rowcount int
set @selectstring='select @@rowcount'+
' from '+@tblname+
' where '+@field_name+'='+@value
set @rowcount=@@rowcount
exec sp_executesql @selectstring
و به این شکل در جدول pubs فرا خوانی کردم جواب داد.

search_field 'authors','au_id','''172-32-1176'''

resident
سه شنبه 09 بهمن 1386, 23:03 عصر
سلام.فکر میکنم باید به این شکل بنویسی.
(راستی خطا داره از پارامتر parameters@ خطا میگیره در صورتیکه اصلا این پارامتر وجود ندارد)



create procedure search_field @tblname nvarchar(40),
@field_name nvarchar(50),@value nvarchar(40)
as
declare @selectstring nvarchar(200)
declare @rowcount int
set @selectstring='select @@rowcount'+
' from '+@tblname+
' where '+@field_name+'='+@value
set @rowcount=@@rowcount
exec sp_executesql @selectstring
و به این شکل در جدول pubs فرا خوانی کردم جواب داد.

search_field 'authors','au_id','''172-32-1176'''

آقای صادقیان از اینکه برای حل این مشکل وقت میذارید ممنونم.
و اما کد:
وقتی sp رو فراخوانی می کنم error میده. اون کدی هم که خودم نوشته بودم همین مشکل رو داشت. وقتی خود پروسیجر رو اجرا میکنم مشکلی نداره(هم در مورد کد شما و هم کد خودم) اما وقتی اونو فراخوانی میکنم error میده.
اشکال از نحوه فراخوانیمون نیست؟

حمیدرضاصادقیان
چهارشنبه 10 بهمن 1386, 07:22 صبح
خوب پس کدی که برای فراخوانی نوشتید رو اینجا قرار بدید.

resident
چهارشنبه 10 بهمن 1386, 07:29 صبح
یکبار مثل شما فراخوانی کردم:

search_field 'authors','au_id','''172-32-1176'''

یکبار هم :


declare @tblname nvarchar(40)
declare @field_name nvarchar(50)
declare @value nvarchar(40)
set @tblname='pishnahade_tarh'
set @field_name='code_pishnahade_tarh'
set @value='0011'
exec search_field @tblname,@field_name,@value