PDA

View Full Version : سوال: تبدیل مجموعه از نوع nvarchar به مجموعه ای از نوع int



baran_mehr
جمعه 21 آبان 1389, 13:20 عصر
سلام
چطور میتونم این مجموعه رو ('1','2','3','4') به این مجموعه تبدیل کنیم(1,2,3,4)

esmit61
جمعه 21 آبان 1389, 14:58 عصر
با تابع cast

baran_mehr
جمعه 21 آبان 1389, 14:59 عصر
فکر کنم باید کمی بیشتر توضیح بدم
دوستان فرض کنید من یه همچین متغییری دارم و میخوام تو یک جدول این اعداد رشته ای رو جستجو کنم

declare @site as varchar(20)
set @site = ’1,2,3,4,5,6,7,8,9′

baran_mehr
جمعه 21 آبان 1389, 15:02 عصر
با تابع cast
بله cast و Convert برای تبدیل نوع های داده به کار میرن
اما نکته اینجاست باید بهشون تک مقدار داد یعنی من اگر بنویسم

convert(int,'12')
نتیجه کار درست هست و مشکلی نیست اما اگر بخوام مجموعه ای از مقادیر رو بهش پاس بدم خطا میگیره

Reza_Yarahmadi
جمعه 21 آبان 1389, 15:38 عصر
ميتونيد به صورت زير عمل كنيد
Declare @Site varchar(Max), @Str varchar(Max)
Set @Site = '1,2,3,4,5,6,7'

Set @Str = 'Select * From TableName where Id IN (' + @Site + ')'
EXEC (@Str)

baran_mehr
جمعه 21 آبان 1389, 17:21 عصر
ممنون دوست عزیز کد شمارو نوشتم کار کرد اما وقتی برای جدول خودم استفاده میکنم خطا میگیره

Declare @Site varchar(50), @Str varchar(50)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)

Set @Str = 'Select name_dars From dbo.Dars where code_dars IN (' + @Site + ')'
EXEC (@Str)

میشه راهنمایی کنی
میخوام یه همچین کاری کنم یعنی کد های درس رو دربارم و بگم چه پیشنیازهایی داره

Rezahak
شنبه 22 آبان 1389, 09:38 صبح
سلام
بايد هم خطا بدهد بخاطر اينكه شما در يك مورد بيش از يك پيشنياز داريد و وقتي مي خواهيد نام آنها را از جدول دروس در @str‌كه يك متغير رشته اي است برگردانيد بيش از يك ركورد در نتيجه خواهد آمد كه باعث خطا مي شود . يك پيشنهاد چرا پيشنياز ها را به صورت يك جدول مر تبط با دروس ذخيره نمي كنيد؟

Reza_Yarahmadi
شنبه 22 آبان 1389, 15:42 عصر
میخوام یه همچین کاری کنم یعنی کد های درس رو دربارم و بگم چه پیشنیازهایی داره
كوئري زير رو امتحان كنيد ببينيد كارتون رو راه ميندازه يا نه
With h1 as(
Select
t1.Id,
t1.Name,
t2.Name as Pre
From
tbl t1 Left Outer Join tbl t2
On
CharIndex(Cast(t2.Id as varchar) + ',', t1.PreIds + ',') <> 0
)
,h2 as
(
Select
h.Id,
h.Name,
Prerequisite = Case
When 1 = 1
Then (Select Pre + ',' From h1 Where Name = h.Name For xml Path(''))
End
From
h1 h
Group By
Name,
h.Id
)
Select
Id,
Name,
Prerequisite = Case
When Len(Prerequisite) > 0
Then Substring(Prerequisite, 1, Len(Prerequisite) - 1)
End
From
h2
Order By
Id

baran_mehr
شنبه 22 آبان 1389, 16:19 عصر
بايد هم خطا بدهد بخاطر اينكه شما در يك مورد بيش از يك پيشنياز داريد و وقتي مي خواهيد نام آنها را از جدول دروس در @str‌كه يك متغير رشته اي است برگردانيد بيش از يك ركورد در نتيجه خواهد آمد كه باعث خطا مي شود .
سلام
اصلا طرح این سوال به دلیل همین مشکل بود دوست عزیز، شما اگر از پست اول نگاه میکردید متوجه میشدید

يك پيشنهاد چرا پيشنياز ها را به صورت يك جدول مر تبط با دروس ذخيره نمي كنيد؟
در ابتدا میخواستم این کار رو انجام بدم اما بیشتر دوست دارم به این شیوه این کار رو بکنم
این شیوه ای که بخوام یک جدول برای پیشنیاز و یک جدول برای همنیاز بزارم کار رو خیلی ساده میکنه ، بیشتر دوست داشتم به این سبک عمل کنم

كوئري زير رو امتحان كنيد ببينيد كارتون رو راه ميندازه يا نه
دوست عزیز میشه یه توضیح مختصر در رابطه با کدی که گذاشتید بدید
h1 , t1, t2 و ... چی هستن؟
میشه بر اساس این جدول توضیح بدید
ممنون

Reza_Yarahmadi
شنبه 22 آبان 1389, 16:56 عصر
h1 , h2 دو نام براي جستجو هاي انجام شده است.(در مورد دستور With جستجو كنيد)
d1 , d2 دو نام مجازي براي جدول Dars است (براي راحتي كار)
كد زير براي جدول شما نوشته شده. ابتدا يك join از جدول درس با خودش انجام شده كه شرط اين Join اينه كه Id هر درس توي فيلد پيش نيازها باشه. چون اين شرط در صورت وجود چند پيشنياز چند سطر نمايش ميده بايد ركورد ها با هم جمع بشن.
چيزي مثل زير
شي گرا برنامه سازي 1
شي گرا برنامه سازي 2

توي Select دوم (h2) اين ركوردها با هم جمع ميشن و در نهايت هم بر اساس كد درس مرتب شده و نمايش داده ميشن.
(راستش توضيح داده كد از نوشتنش خيلي سختتره!! :چشمک:)

With h1 as(
Select
d1.Code_Dars,
d1.Name_dars,
d2.Name_dars as Pishniaz
From
Dars d1 Left Outer Join Dars d2
On
CharIndex(Cast(d2.Code_Dars as varchar) + ',', d1.Pishniaz + ',') <> 0
)
,h2 as
(
Select
h.Code_Dars,
h.Name_dars,
Pishniaz = Case
When 1 = 1
Then (Select Pishniaz + ',' From h1 Where Name_dars = h.Name_dars For xml Path(''))
End
From
h1 h
Group By
h.Name_dars,
h.Code_Dars
)
Select
Code_Dars,
Name_dars,
Pishniaz = Case
When Len(Pishniaz) > 0
Then Substring(Pishniaz, 1, Len(Pishniaz) - 1)
End
From
h2
Order By
Code_Dars

baran_mehr
دوشنبه 24 آبان 1389, 08:36 صبح
ممنون دوست عزیز
یه سوال دیگه: فرض کنید نتیجه دستور زیر که شما نوشته بودید 3 تا رکورد میشه مثل زیر:

Declare @Site varchar(50), @Str varchar(200)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)
Set @Str = 'Select name_dars from Dars where code_dars IN (' + @Site + ')'
EXEC (@Str)
برنامه نویسی1
برنامه نویسی2
سیستم عامل
ایا دستوری هست که نتیجه خروجی رو جلوی هم نشون بده مثلا به این شکل:
برنامه نویسی1 , برنامه نویسی2 , سیستم عامل

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 08:45 صبح
توي كد قبلي كه گذاشتم Select دومش همين كار رو انجام ميده (h2).
براي كدي كه اينجا گذاشتيد بصورت زير عمل كنيد

Set @Str = 'Select name_dars + '' '' from Dars where code_dars IN (' + @Site + ') For XML Path('''')'

baran_mehr
دوشنبه 24 آبان 1389, 10:55 صبح
خطا زیر رو میده!!

Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'Path'.

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 11:07 صبح
نميدونم شما چطور نوشتيد من كد شما رو بصورت زير مينويسيم مشكلي پيش نمياد

Declare @Site varchar(50), @Str varchar(200)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)
Set @Str = 'Select name_dars + '' '' from Dars where code_dars IN (' + @Site + ') For XML Path('''')'
EXEC (@Str)
لطفا كدي كه نوشتيد رو اينجا بذاريد. ورژن SQL خودتون رو هم بگيد.

baran_mehr
دوشنبه 24 آبان 1389, 13:20 عصر
همین کدی که نوشتید رو نوشم اما بازم همین خطای بالا رو میده

نميدونم شما چطور نوشتيد من كد شما رو بصورت زير مينويسيم مشكلي پيش نمياد
کد:
Declare @Site varchar(50), @Str varchar(200)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)
Set @Str = 'Select name_dars + '' '' from Dars where code_dars IN (' + @Site + ') For XML Path('''')'
EXEC (@Str)لطفا كدي كه نوشتيد رو اينجا بذاريد. ورژن SQL خودتون رو هم بگيد.

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 13:35 عصر
بعد از پر شدن Site ببينيد محتوياتش چيه؟ تنها چيزي كه به نظرم ميرسه اينه كه مشكل از اون باشه!
چون اين دستور به همين نحو روي سيستم من بدون هيچ خطايي داره كار ميكنه.
روش ديگه اي كه ميشه اين كار رو انجام داد بصورت زير

Declare @Site varchar(50), @Str varchar(200)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)
Set @Str = '
Declare @Result nvarchar(max)
Set @Result = ''
Select @Result = @Result + name_dars + '' '' from Dars where code_dars IN (' + @Site + ')
Select @Result'
EXEC (@Str)
نگفتيد از چه ورژني از SQL استفاده ميكنيد؟

baran_mehr
دوشنبه 24 آبان 1389, 14:43 عصر
تعداد خطاهاش بیشتر شد.برکت کرده:لبخند:
از sql2000 استفاده میکنم
نتیجه دستور زیر شد

Declare @Site varchar(50), @Str varchar(200)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)
Set @Str = 'Select name_dars + '' '' from Dars where code_dars IN (' + @Site + ') For XML Path('''')'
print @str
EXEC (@Str)
این خروجی:

Select name_dars + ' ' from Dars where code_dars IN (1004,1006) For XML Path('')
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'Path'.

baran_mehr
دوشنبه 24 آبان 1389, 14:49 عصر
دوست عزیز شما چه پیشنهادی برای این کار میدید
من قراره یه جدول درس داشته باشم تا اصلاعات دروس رو نگه دارم و گاهی نیاز میشه که پیشنیازها و هم نیازها رو همراه با نام درس مورد نظر نمایش بدم
من بیشتر دلم میخواد که اطلاعات تو یک جدول باشه و این کارو کنم اما یواش یواش کار داره پیچیده میشه
شاید راه سادتری به ذهن شما برسه!!!

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 15:24 عصر
از sql2000 استفاده میکنم
روش اولي كه گفتم براي 2000 كار نميكنه و بايد از روش دوم بصورت زير استفاده كنيد

Declare @Site varchar(50), @Str varchar(200)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)
Set @Str = '
Declare @Result nvarchar(3999)
Set @Result = ''''
Select @Result = @Result + name_dars + '' '' from Dars where code_dars IN (' + @Site + ')
Select @Result'
EXEC (@Str)

من قراره یه جدول درس داشته باشم تا اصلاعات دروس رو نگه دارم و گاهی نیاز میشه که پیشنیازها و هم نیازها رو همراه با نام درس مورد نظر نمایش بدم
اگر پيشنيازها رو جدا و توي يك جدول ديگه بياريد كارتون به مراتب راحتتر ميشه (بخاطر استفاده از SQL 2000)
با جدا كردنشون و با يك join ساده ميتونيد بازم به نتيجه مورد نظرتون برسيد.

من بیشتر دلم میخواد که اطلاعات تو یک جدول باشه و این کارو کنم اما یواش یواش کار داره پیچیده میشه
دوست داشتن شما يك چيزه طراحي بهينه هم يك چيز ديگه است!! :چشمک:

baran_mehr
دوشنبه 24 آبان 1389, 15:51 عصر
خیلی ممنون
خوب حالا چطوری باید به این Str@ فیلد اضافه کرد!!
مثلا سایر اطلاعات رو هم نشون بده مثل واحد و ..
یا چطور باید Join انجام داد
این چند روزه مخم داره سوت میکشه:لبخند:

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 15:58 عصر
خوب حالا چطوری باید به این Str@ فیلد اضافه کرد!!
مثلا سایر اطلاعات رو هم نشون بده مثل واحد و ..
بصورت زير

Declare @Site varchar(50), @Str varchar(200)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=1007)
Set @Str = '
Declare @Result nvarchar(3999)
Set @Result = ''''
Select @Result = @Result + name_dars + '' '' from Dars where code_dars IN (' + @Site + ')
Select code_dars, name_dars, @Result as Pishniaz From Dars where code_dars = 1007'
EXEC (@Str)

baran_mehr
دوشنبه 24 آبان 1389, 20:01 عصر
دوست عزیز بازم به مشکل برخوردم:ناراحت:
میخوام سعی کنم چند تا جدولو بهم مرتبط کنم اما نمیشه

Declare @Site varchar(50), @Str varchar(400)
declare @code varchar (1000)
set @code=(SELECT code_dars FROM Eraee_Dars)
Set @Site =(Select pishniaz From dbo.Dars where code_dars=@code)
Set @Str = '
Declare @Result nvarchar(3999)
Set @Result = ''''
Select @Result = @Result + name_dars + '' '' from Dars where code_dars IN (' + @Site + ')
Select code_dars, name_dars, @Result as Pishniaz From Dars where code_dars ='+ @code
EXEC (@Str)
تا اینجا خوب پیش رفتیم اما ثمره تمام این کارها تو این بخش خلاصه میشه
چون باید ارتباط چند تا جدولو به کاربر نمایش بدم
میخوام دروسی که ارائه میشه با اطلاعات کامل به کاربران نمایش داده بشه
اگر ممکنه راهنماییم کنید

baran_mehr
دوشنبه 24 آبان 1389, 20:26 عصر
دوست عزیز هدف نهایی من اینی هست که تو تصویر نشون دادم
اگر ممکنه راهنماییم کنید
من میخوام چیزی که تو جدول ارائه وجود داره و اکثرا کدفیلدها هست گرفته بشه و به دانشجو به صورت نام فیدها نشون داده بشه
مقلا به جای کد گروه کامیپوتر که 110 هست به دانشجو نشون بده" کامپیوتر"

Reza_Yarahmadi
سه شنبه 25 آبان 1389, 10:10 صبح
دوست عزيز پيشنهاد ميكنم دست از سر 2000 بر داريد و بيايد سراغ 2005 ، اينطوري كمتر هم دچار مشكل ميشيد.
براي چيزي كه ميخوايد اينبار راه حل ميدم شما زحمتشو بكشيد تا هم دستتون توي كوئري نوشتن راه بيفته هم لذت جواب گرفتنش رو خودتون بچشيد :چشمک:
براي اينكار ميتونيد از كرسر استفاده كنيد ، هر بار يك سطر رو بخونيد و داده هاي مورد نظرتون اعم از نام درس و پيش نيازها و ... رو بدست بياد رو توي يك جدول كمكي ذخيره كنيد. وقتي براي همه اين ركوردها اين كار رو كرديد تمام محتويات جدول كمكي رو نمايش بديد و در آخر جدول كمكي رو حذف كنيد.

behrouzlo
سه شنبه 25 آبان 1389, 11:57 صبح
البته فکر کنم بدون كرسر هم می شود با کارایی بیشتری همه به جواب رسید

baran_mehr
سه شنبه 25 آبان 1389, 12:28 عصر
اصلا این کرسر چی هست؟
متاسفانه من یک ماه بیشتر تا پایان این پروژه وقت ندارم، بعد از اون با 2008 شروع به کار میکنم.

baran_mehr
سه شنبه 25 آبان 1389, 13:18 عصر
خوب بعد از سرک کشیدن تو چند تا سایت و کتاب تونستم بفهمم کرسر چی هست و چجور تعریف میشه و باز و بسته
اما هنوز نمیدونم چطور باید ازش تو این مثال استفاده کنم؟

Reza_Yarahmadi
سه شنبه 25 آبان 1389, 16:02 عصر
اما هنوز نمیدونم چطور باید ازش تو این مثال استفاده کنم؟
كد زير يك نمونه براي كاري است كه ميخوايد انجام بديد.
البته چون جدولهاي شما رو نداشتم نتونستم تستش كنم ولي منطقش درسته.

Create Table #Temp(
groh nvarchar(3999) NULL,
name_dars nvarchar(3999) NULL,
name_ostad nvarchar(3999) NULL,
pishniaz nvarchar(3999) NULL
)
Declare @Str nvarchar(3999),
@Name_dars nvarchar(3999),
@Name_Ostad nvarchar(3999),
@pishniaz nvarchar(3999),
@name_groh nvarchar(3999),
@Code_groh int,
@Code_Ostad int,
@code_Dars int

Declare src Cursor
For
Select
Code_groh,
Code_Ostad,
code_Dars
From
dorose_EraeShode

Open src
Fetch Next From src Into @Code_groh,
@Code_Ostad,
@code_Dars
While (@@Fetch_Status = 0)
begin
Select @name_Ostad = NameOstad From tblOstad where code_Ostad = @Code_Ostad
Select @name_groh = name_groh From tblGroh where code_groh = @code_groh
Select @Name_dars = Name_dars From tbldars where code_dars = @code_dars
Select @pishniaz = pishniaz From tbldars where code_dars = @code_dars
Set @Str = '
Declare @pishniaz2 nvarchar(3999)
Set @pishniaz2 = ''''
Select
@pishniaz2 = @pishniaz2 + name_dars + '' ''
from
Dars
where
code_dars IN (' + @pishniaz + ')
Insert Into
#Temp (groh,name_dars,name_ostad,pishniaz)
Values (
''' + @name_groh + ''',
''' + @Name_dars + ''',
''' + @name_Ostad + ''',
@pishniaz2)
'
EXEC (@Str)
Fetch Next From src Into @Code_groh,
@Code_Ostad,
@code_Dars
End
Close src
Deallocate src
Select * From #Temp
Drop Table #Temp

baran_mehr
سه شنبه 25 آبان 1389, 20:52 عصر
واقعا ممنونم ازت دوست عزیز
با یکم تغییری که توش دادم داره جواب رو بهم نشون میده اما چند تا خطا هم میگیره:
دلیل این خطا چی میتونه باشه،هر چند که داره خروجی رو هم نمایش میده
البته یه ایراد دیگش اینه که من تو جدولم 5 تا رکورد دارم اما داره 2 تا رکوردمو نمایش میده

Warning: The table '#Temp' has been created but its maximum row size (32021) exceeds the maximum number of bytes per row (8060). INSERT or UPDATE of a row in this table will fail if the resulting row length exceeds 8060 bytes.
Server: Msg 170, Level 15, State 1, Line 9
Line 9: Incorrect syntax near ')'.
Server: Msg 170, Level 15, State 1, Line 9
Line 9: Incorrect syntax near ')'.
Server: Msg 170, Level 15, State 1, Line 9
Line 9: Incorrect syntax near ')'.
Warning: The table '#Temp' has been created but its maximum row size (32021) exceeds the maximum number of bytes per row (8060). INSERT or UPDATE of a row in this table will fail if the resulting row length exceeds 8060 bytes.
کد تغییر یافته این شده

Create Table #Temp(
groh nvarchar(3999) NULL,
name_dars nvarchar(3999) NULL,
name_ostad nvarchar(3999) NULL,
pishniaz nvarchar(3999) NULL
)
Declare @Str nvarchar(3999),@Name_dars nvarchar(3999),@Name_Ostad nvarchar(3999), @pishniaz nvarchar(3999),@name_groh nvarchar(3999), @Code_groh int,@Code_Ostad int,@code_Dars int

Declare src Cursor
For
Select code_group,job_number, code_Dars From dbo.Eraee_Dars

Open src
Fetch Next From src Into @Code_groh, @Code_Ostad, @code_Dars
While (@@Fetch_Status = 0)
begin
SELECT @name_Ostad =name + ' ' + family FROM Person WHERE (code_meli =(SELECT code_meli FROM JobHolder WHERE (Job_number = @Code_Ostad)))
Select @name_groh = name From [Group] where code_group = @code_groh
Select @Name_dars = Name_dars From dbo.Dars where code_dars = @code_dars
Select @pishniaz = pishniaz From dbo.Dars where code_dars = @code_dars
Set @Str = '
Declare @pishniaz2 nvarchar(3999)
Set @pishniaz2 = ''''
Select
@pishniaz2 = @pishniaz2 + name_dars + '' ''
from
Dars
where
code_dars IN (' + @pishniaz + ')
Insert Into
#Temp (groh,name_dars,name_ostad,pishniaz)
Values (
''' + @name_groh + ''',
''' + @Name_dars + ''',
''' + @name_Ostad + ''',
@pishniaz2)
'
EXEC (@Str)
Fetch Next From src Into @Code_groh,
@Code_Ostad,
@code_Dars
End
Close src
Deallocate src
Select * From #Temp
Drop Table #Temp