PDA

View Full Version : خطا هنگام استفاده از union



brida_kh
چهارشنبه 20 تیر 1386, 10:56 صبح
با سلام.
آیا هنگام استفاده از دستور union باید شرایط خاصی را رعایت کرد.
من با این دستور چند تا select رو به هم وصل میکنم و با این خطا مواجه میشم:


Cannot resolve collation conflict for UNION operation

ممنون میشم اگار راهنمائیم کنید

Sayehzendeh
چهارشنبه 20 تیر 1386, 11:12 صبح
سلام

بله هنگام استفاده از دستور UNION باید فیلدهایی که در هر SELECT استخراج میکنید
همسان و همنام باشند

brida_kh
چهارشنبه 20 تیر 1386, 11:26 صبح
نوع داده ها یکسان هستند اما فکر نمیکنم الزامی برای همنام بودنشون باشه

sarvestan
چهارشنبه 20 تیر 1386, 12:21 عصر
باید همنام باشند و ترتیب را هم تا حد امکان رعایت کنید

brida_kh
چهارشنبه 20 تیر 1386, 13:28 عصر
دوست عزیز متاسفانه با فیلدهای همنام هم همین خطا رو مشاهده کردم

MajerajooyeKhallagh
چهارشنبه 20 تیر 1386, 14:01 عصر
دوست عزیز
هنگام union کردن,نیازی نیست که حتما فیلدها همنام باشند یا نوع آنها با هم برابر باشند و در خروجی کواری,هدر فیلدهای رکورد های خروجی ,میشود همان آلیاسهایی که در Select اول Union استفاده کرده اید ولی لازم است که تعداد فیلدهایی که در Select ها استفاده میکنید حتما با هم برابر باشند,این خطای شما احتمالا به خاطر Union کردن فیلدهایی از Select با هم هستید که Collation آنها با هم فرق دارند,برای رفع این مشکل باید Collation آنها را با هم یکسان کنید به عنوان مثال به صورت زیر :


select f1 COLLATE SQL_Latin1_General_CP1_CI_AS as a,f2 as b from T1
union
select f3 COLLATE SQL_Latin1_General_CP1_CI_AS as c ,f4 From T2


توجه کنید که فیلدهای متناظر در Union باید Collation آنها با هم برابر باشند(مطابق با مثال آورده شده)
مساله Collate هم در مورد فیلدهایی که از نوع nvarchar هستند اتفاق میافتد نه فیلدهای از نوع عددی
البته توجه داشته باشید که Collation را باید Collation مناسب با دیتابیس و فیلدتون بگیرید,البته در زبان فارسی اصولا و غالبا همین Collation را که آورده ام,استفاده میکنند
برای راهنمایی بیشتر میتونید به این لینک از MSDN هم سری بزنید :(در بخش How Do I از Help )
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/58c4e64b-5634-4c29-aa22-33193282dd27.htm

امیدوارم با این راهنمایی مشکلتون حل بشه

brida_kh
پنج شنبه 21 تیر 1386, 09:56 صبح
دوست عزیز کد مورد نظر را یه نگاهی بندازید:



SELECT id as id, 'page' as tbName ,pTitle COLLATE SQL_Latin1_General_CP1_CI_AS AS name, pshort AS short, pcoment AS coment FROM tblPage WHERE active=1 AND (pTitle LIKE @phrase OR pShort LIKE @phrase OR pcoment LIKE @phrase ) )"
+ "UNION "
+ "(SELECT NewsID as id, 'News',NewsTitle COLLATE SQL_Latin1_General_CP1_CI_AS AS name, NewsShort , NewsComent FROM tblNews WHERE active=1 AND (NewsTitle LIKE @phrase OR NewsShort LIKE @phrase OR NewsComent LIKE @phrase )) "
+ "UNION "
+ "(SELECT id as id, 'state', pTitle COLLATE SQL_Latin1_General_CP1_CI_AS AS name, pShort, pcoment FROM tblPageState WHERE active=1 AND (pTitle LIKE @phrase OR pShort LIKE @phrase OR pComent LIKE @phrase)) ";

موارد گفته شده را رعایت کردم.اما همچنان با خطا برخورد میکنم

whitehat
پنج شنبه 21 تیر 1386, 10:12 صبح
فکر نکنم مشکل از Collation باشه ،شما از Name که یک کلمه کلیدی برای SQL است استفاده کرده اید ،کوئری خود را به این شکل بنویسید

"SELECT
id as id
,'page' as tbName
,pTitle AS [name]
,pshort AS [short]
,pcoment AS coment
FROM tblPage
WHERE (active=1)
AND (pTitle LIKE @phrase OR pShort LIKE @phrase OR pcoment LIKE @phrase)"
+ "UNION "
+ "
SELECT
NewsID as id
,'News' AS tbName
,NewsTitle AS [name]
,NewsShort AS [short]
,NewsComent AS coment
FROM tblNews
WHERE (active=1)
AND (NewsTitle LIKE @phrase OR NewsShort LIKE @phrase OR NewsComent LIKE @phrase )"
+ "UNION "
+ "
SELECT
id as id
,'state' AS tbName
,pTitle AS [name]
,pShort AS [short]
,pcoment AS coment
FROM tblPageState
WHERE (active=1) AND (pTitle LIKE @phrase OR pShort LIKE @phrase OR pComent LIKE @phrase)";

MajerajooyeKhallagh
پنج شنبه 21 تیر 1386, 10:48 صبح
لطفا برای تمام فیلدهای از نوع غیر عددی این Collate را بزارید و تست کنید دوباره(منظورم اون مقادیری هست که خودتون دستی ست کردید مانند 'page' و ...)
اگر حل نشد,لطفا خطایی را که در این حالت میدهد را بگید

brida_kh
پنج شنبه 21 تیر 1386, 14:00 عصر
موارد گفته شده رو رعایت کردمو با این خطا مواجه شدم


The text, ntext, or image data type cannot be selected as DISTINCT.

AminSobati
جمعه 22 تیر 1386, 00:26 صبح
دوست عزیزم،
دقیقا Typeهایی که عنوان شده، به خاطر مقایسه پذیر نبودن، نمیتونن در Order By یا Group By و همچنین Distinct شرکت کنند. در 2005 این محدودیت روی Type های VARCHAR MAX و NVARCHAR MAX و VARBINARY MAX برطرف شده که جایگزین اون سه Type هستند.

MajerajooyeKhallagh
شنبه 23 تیر 1386, 07:59 صبح
موارد گفته شده رو رعایت کردمو با این خطا مواجه شدم


The text, ntext, or image data type cannot be selected as DISTINCT.


دوست عزیز
پس مشکل خطای اول شما که روی Collation بود حل شد.حال خطایی که صادر میشود,خطای مربوط به فیلدی است که از نوع Text یا Image گرفته اید که با توجه به فرمایش آقای ثباتی,فکر میکنم با رعایت این مساله دیگه مشکلتون کاملا حل بشه

brida_kh
شنبه 23 تیر 1386, 09:18 صبح
دوستان من نه از دستور group by و نه از order by استفاده کردم.:گیج:

reza_rad
شنبه 23 تیر 1386, 09:26 صبح
دوستان من نه از دستور group by و نه از order by استفاده کردم.

چون UNION تکراری ها رو حذف میکنه عملکردی مثل Distinct داره که احتمالا باعث میشه خطای گفته شده رو روی فیلدهای ntext دریافت کنید.

UNION رو به UNION ALL تغییر بدید ببینید مشکل حل میشه؟
.

brida_kh
شنبه 23 تیر 1386, 10:11 صبح
چون UNION تکراری ها رو حذف میکنه عملکردی مثل Distinct داره که احتمالا باعث میشه خطای گفته شده رو روی فیلدهای ntext دریافت کنید.
.

گفته شما کاملا صحیح بود
از همه دوستان که کمکم کردند ممنونم