PDA

View Full Version : تابعی که کلید جدول را باز می گرداند و نام جدول و نام ستون را بعنوان پارامتر دریافت میکند



aebrs@yahoo.com
شنبه 20 اسفند 1390, 07:29 صبح
Function that get Table and field name as param and return Identity
با سلام
معمولا در کارها و جائیکه بخواهیم از کلید خودکار استفاده نکنیم، از تابع برای تعیین مقدار کلید استفاده میکنیم، من از این نوع تابع استفاده میکنم:



ALTER FUNCTION [dbo].[MaxIdLineMain]
( @Maxi int)
RETURNS INT
AS
BEGIN
DECLARE @MaxId int
Declare TreeCur Cursor
for select isnull(max(Id),0)+1 as Maxi from [dbo].[LineMain]
Open TreeCur
FETCH NEXT FROM TreeCur into @MaxId
RETURN @MaxId
END

اما اکنون می خواهم که این تابع را تغییر داده و تنها از یک تابع استفاده کنم و نام جدول و نام ستون را به آن ارجاع داده و تابع مقدار کلید را بازگرداند، که هنوز موفق نشده ام کد جدید به این صورت است :


ALTER FUNCTION [dbo].[MaxId]
(
@TableName varchar(50),
@FieldName varchar(50)
)
RETURNS INT
AS
BEGIN
DECLARE @MaxId int
Declare @TreeCur Cursor
EXEC sp_executesql
N'for select isnull(max(@FieldName),0)+1 as Maxi from [dbo].[@TableName] Open @TreeCur;',
N'@TreeCur cursor OUTPUT', @TreeCur OUTPUT

FETCH NEXT FROM @TreeCur into @MaxId
RETURN @MaxId
END


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

baktash.n81@gmail.com
شنبه 20 اسفند 1390, 07:53 صبح
سلام

در مورد تابع اول نیازی به Cursor وجود نداره ! ... یا حداقل من نفهمیدم چرا از Cursor استفاده کردید.

در خصوص تابع دوم ... نمی تونیم تو Scaler Function ها از exec استفاده کرد ... بهتره یه Sp برای این کار بنویسید ...

aebrs@yahoo.com
شنبه 20 اسفند 1390, 07:56 صبح
سلام

در مورد تابع اول نیازی به Cursor وجود نداره ! ... یا حداقل من نفهمیدم چرا از Cursor استفاده کردید.

در خصوص تابع دوم ... نمی تونیم تو Scaler Function ها از exec استفاده کرد ... بهتره یه Sp برای این کار بنویسید ...

با سلام و ممنون از پاسخ شما
می توانید نمونه SP پیشنهادی خود را بنویسید؟

aebrs@yahoo.com
شنبه 20 اسفند 1390, 10:32 صبح
ضمن تشکر از دوستان،
من این تابع را نوشتم و برای مورد من جواب داده است


CREATE PROCEDURE [dbo].[aMaxId]
@TableName nvarchar(100),
@FieldName nvarchar(100) AS
DECLARE @sql nvarchar(4000)
SELECT @sql = ' SELECT IsNull(Max('+@FieldName+'),0)+1 as Maxi' +
' FROM dbo.'+@TableName
EXEC sp_executesql @sql