yasirhantoush

identity in varchar column

9 ردود في هذا الموضوع

ارجوكم ساعدوني ،، اريد ان استعمل ال identity مع ال varchar column

اريد ان اصنع جدول طلاب (students) به column من النوع varchar و يكون هذا الكولمن priary key , و ايضا auto increment

بحثت عن الموضوع لكن وجدت ال identity لا تتعامل مع ال varchar

مثلا يكون الجدول كالتالي

id name

_______________________

STD0001 mohamed

STD0002 Ahmed

STD0003 Abdo

حيث يكون ال id autoincrement

اظن ان الحل عن طريق استخدام procedure او trigger و لكن خبرتي ضعيفة

ارجوووووووووووووووكم المساعدة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

السلام عليكم

سؤالك حلو ولذيذ وانا أحب الأسئلة دي :)

أولا نحن نتفق أن ال varchar لا يمكن أن يكون identity لذلك سألجأ في حلي إلى الحيلة

دعنا نفترض أن لدينا جدول اسمه tbl_students وهذا الجدول يحتوي على اسم الطالب student_name من النوع varchar وحجمه 50 مثلاً وأيضاً سنضيف حقلين آخرين الأول نسميه id ، ونجعله identity ولكن لاحظ أنه ليس المفتاح الأساسي PK ، والحقل الآخر نسميه مثلاً var_id ونجعله المفتاح الأساسي وحجمه مثلاً 20 الآن نفذنا جزء من الحيلة :)

نأتي للجزء الآخر وهو إنشاء stored procedure وظيفته عمل insert أو إدخال لسجل جديد في هذا الجدول سنكتب فيه الكود الآتي :

CREATE PROCEDURE prc_tbl_students_ins
(
@id int =null output,
@var_id varchar(20),
@student_name varchar(50)
)
As
BEGIN
       SET @var_id ='STD000' +  @@identity
INSERT
INTO [tbl_students]
(
[var_id],
[student_name]
)
VALUES
(
@var_id,
@student_name
)
            set @id = @@identity

End
GO

هل لاحظت الحيلة ؟؟

نعم نقوم بأتمتة عملية إنشاء المفتاح الأساسي بحيث يعتمد على ال identity بالنسبة للجدول ثم نضيف عليه الرموز التي تناسبنا مثل "STD000" في حالتنا هذه ..

أرجو ان أكون ساهمت في مساعدتك ، وإن كنت أظن أن هناك حلولاً أخرى من خلال كود البرنامج مثلاً ..

بالمناسبة هذا الكود وليد اللحظة أي أنني لم أجربه ويحتمل الصواب والخطأ ولكنه ما حضر في ذهني الآن ، وقد يكون بداية خيط لك ..

وفقك الله تعالى للخير والهدى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ربما تحتاج لأن تجعل السطر التالي

@var_id varchar(20)

هكذا

@var_id varchar(20) =null output

أظن انه هكذا سيكون صحيح إن شاء الله تعالى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اشكرك بشده يا محمد

تستاهل وسام الجدارة بحق

انا ايضا جاءتني فكرة منك

(لو لا انت لما جاءتني الفكرة)

و هي باستخدام ال default

و ايضا لا تحتاج الى procedure

و بدلا من ذلك ، تستخدم الدالة IDENT_CUUR('table Name و التي ترجع اخر قيمة لل ident و من ثم يتم تحويلها الي varchar و اضافتها لل STD وضعها في ال default

create table [tbl_students]
(
[std_id] int IDENTITY(1,1),
[var_id] varchar (20) default 'STD' + CAST(IDENT_CURRENT('tbl_students') AS VARCHAR),
[student_name] varchar (50)
)
go

insert into tbl_students(student_name) values('mohammed')
select * from tbl_students

ولكن هنالك بعض المشاكل ،، انه ما زال يوجد العمود std_id ، الخطوة القادمة ان نلغيه

ثم اود ان استفسر

ما هي الطريقة التي يتم بها عمل فورمات لل integers

مثلا الرقم 12 يظهر بالشكل 0012

مرة اخري اشكرك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الشكر لله تعالى والفضل له وحده سبحانه علينا جميعاً

:)

جزاك الله خيراً ، وبالفعل الدالة IDENT_CURRENT دالة رائعة ولقد قمت من قبل بشرح الفرق بيناها وبين مثيلاتها في موضوع ما ..

المهم حلك جميل جداً فعلاً وأرجو أن تكون قمت بتجربته وأن يكون نجح مع التذكيربأنه من الضروري أن تجعل ال var_id هو المتاح الأساسي وليس ال id

أما موضوع الاستغناء عن ال id :) فطبعاً طالما نستخدم إحدى دوال ال identitiy فهذا غير ممكن ..

ومسألة الفورمات فانا عن نفسي أستخدمها من داخل البرنامج

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم جميعاً :

و كـــــــــــــل عـــــــــام و أنتــــــــم بخيــــر

في ما يخص الموضوع الذي طرحه الأخ yasirhantoush : في مشاركته

identity in varchar column, please , help me , am stuck

الأستاذ محمد النحراوي مع احترامي الشديد لك .. الكود الذي قدمته غير دقيق..

يوجد سطر واحد فقط منه ليس على صواب : وهو

 SET @var_id ='STD000' +  @@identity

الصواب :

 SET @var_id ='STD000' +  Ident_Current('tbl_students')

والباقي من الكود 100% تمام جزاك الله كل الخير ... أخ محمد على المبادرة

After an INSERT, SELECT INTO, or bulk copy statement completes, 
@@IDENTITY contains the last identity value generated by the statement.
If the statement did not affect any tables with identity columns,@@IDENTITY returns NULL.
If multiple rows are inserted, generating multiple identity values,
@@IDENTITY returns the last identity value generated.
If the statement fires one or more triggers that perform inserts that generate identity values,
calling @@IDENTITY immediately after the statement returns the last identity value generated by the triggers.
The @@IDENTITY value does not revert to a previous setting if the INSERT or SELECT INTO statement or bulk copy fails,
or if the transaction is rolled back.
@@IDENTITY, SCOPE_IDENTITY, and IDENT_CURRENT are similar functions in that they return the last value inserted into the IDENTITY column of a table.

من Transact_Sql Help ......

أما الأخ yasirhantoush أيضاً الكود الذي قدمته فهو ممتاز لكن ينقصه استمرار وجود الحقل ID من نوع int ..

لذلك أحببت أن أشارك في حل المسألة .................

أولاً : إنشاء الجدول ..

create table [Students_TB]
(
[StdID] varchar (20),
[StdName] varchar (50)
)

--ثانياً : إنشاء هالإجراء لإدخال السجل ..

create Proc Students_Insert 
 @StdName varchar(50)
as
 declare @NewID as varchar(20)
 select  @NewID = Max(substring(cast(Students_TB.StdID as varchar),6,len(Students_TB.StdID)))-- as varchar(20))
 from  Students_TB
If(@NewID IS Null)
  set @NewID = 'STD000'
else
  set @NewID = 'STD00' + cast( (cast(@NewID as Integer)+ 1) as varchar(20))
Insert Into Students_TB(StdID , StdName) values(@NewId , 'Student Ahmad')
go

إختبار الإدخال :

exec Students_Insert 
 @StdName = 'ahmad'

select * from Students_TB

المبرمج عماد ... B) B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

بلنسبة لى مشاركة الاخ محمد

بالمناسبة هذا الكود وليد اللحظة أي أنني لم أجربه ويحتمل الصواب والخطأ ولكنه ما حضر في ذهني الآن ، وقد يكون بداية خيط لك 

وتم تعديل الكود فى نفس الموضوع

  create table [tbl_students]

(

[std_id] int IDENTITY(1,1),

[var_id] varchar (20) default 'STD' + CAST(IDENT_CURRENT('tbl_students') AS VARCHAR),

[student_name] varchar (50)

)

go

insert into tbl_students(student_name) values('mohammed')

select * from tbl_students   

ملحوظة يمكن عمل الكود السابق الخاص بى الاخ محمد فى سطر واحد فقط عن طريق Fromula

المبرمج محمد الفريق العربى للبرمجة :D

كل عام وانت بخير يا اخ عماد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم waleedhm لم يكن هدفي إنقاص حجم مشاركة الأستاذ الكبير محمد.. بل على العكس كان الهدف إضاءة بسيطة على

المشكلة ووضع حل أي إيجاد حل لإستمرار وجود حقل الترقيم التلقائي ....

و هذا كل شيء و كثر الله من أمثال الأخ محمد النحراوي المعروف بمشاركاته القوية والفعالة ....

المبرمج عماد ... B) B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته :

يا إخوان اكتشفت خطأ بسيط بالاجراء وهذا تعديله ........

Alter Proc Students_Insert 
 @StdName varchar(50)
as

declare @NewID as varchar(20)
select @NewID = Cast(Max(cast(substring(cast(Students_TB.StdID as varchar),6,len(Students_TB.StdID)) as int)) as varchar(20))
 from  Students_TB

If(@NewID IS Null)
 set @NewID = 'STD000'
Else
 set @NewID = 'STD00' + cast( (cast(@NewID as Integer)+ 1) as varchar(20))

print @NewID
 Insert Into Students_TB(StdID , StdName) values(@NewId , 'Student Ahmad')

Go

المبرمج عماد ... B) B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .