PDA

View Full Version : سوال: اسکیو ال سرور 2012 با "ی" مشکل داره؟



gbg
دوشنبه 10 شهریور 1393, 00:12 صبح
این دیگه نوبر
کالیژن دیتابیس روی پرشین هست
با برنامه یک کلمه رو ذخیره می کنم که توش "ی" داره بعد که با برنامه سرچ می کنم پیدا نمی کنه
ویندوز 7 و دلفی XE5

sm_1366
دوشنبه 10 شهریور 1393, 06:20 صبح
سلامم...
من هم همین مشکلو دارم...

یوسف زالی
چهارشنبه 12 شهریور 1393, 11:58 صبح
ی ویندوز ها با هم تفاوت هایی داره.
سرجی که می کنید بصورت where در اس کیو اله یا آن فیلتر رکورد؟

sm_1366
چهارشنبه 12 شهریور 1393, 16:03 عصر
برای من where هستش با همون دستور like

firststep
چهارشنبه 12 شهریور 1393, 17:19 عصر
سلام
shift +ط بگیر

gbg
پنج شنبه 13 شهریور 1393, 19:53 عصر
where هستش
بعدش کلا مسخرست توی برنامه ی رو با d مینویسم و با d سرچ نمیشه تو همون برنامه تو همون ویندوز

benyaminrahimi
شنبه 15 شهریور 1393, 11:38 صبح
در تمام نسخه های اسکیو ال فیلد های varchar برای این کاراکتر ی بصورت ي ذخیره میشه این مورد استثنایی تو کالیژن arabic یا persian نداره این مشکل در حرف ک هم وجود داره

راه حل : حتما فیلد های متنی تون Nvarchar باشه اگرم باز ایم مشکل وجود داشت کامپوننت داره ی رو بصورت ي میفرسته برای همین سرچتون کار نمیکنه ... برای حل این مشکل هم من یه تیکه کد برایتون نوشتم که beforepost دیتاست بذارید این مشکل هم حل میشه



for i := 0 to adata.FieldCount - 1 do
begin
af := adata.Fields[i];


if (af.ReadOnly = False)
and (af.FieldKind = fkData)
and (af.DataType = ftWideString) and (Length(af.AsWideString) > 0) then
begin
af.AsWideString := StringReplace(af.AsWideString, chr(1610), chr(1740),
[rfReplaceAll]); //ي
af.AsWideString := StringReplace(af.AsWideString, chr(1603), chr(1705),
[rfReplaceAll]); //ک
end;



اینم یه stored procedure برای درست کردن دیتای قبلی



ALTER PROCEDURE [dbo].[sp_sys_fix_ky]
AS
BEGIN
DECLARE @Table NVARCHAR(MAX)
DECLARE @Col NVARCHAR(MAX)
DECLARE Table_Cursor CURSOR
FOR
/*پيدا کردن تمام فيلدهاي متني تمام جداول ديتابيس جاري*/
SELECT a.name, /*table*/
b.name /*col*/
FROM sysobjects a,
syscolumns b
WHERE a.id = b.id
AND a.xtype = 'u' /*User table*/
AND (
b.xtype = 99 /*ntext*/
OR b.xtype = 35 /* text*/
OR b.xtype = 231 /*nvarchar*/
OR b.xtype = 167 /*varchar*/
OR b.xtype = 175 /*char*/
OR b.xtype = 239 /*nchar*/
)

OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @Table,@Col
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC (
'update [' + @Table + '] set [' + @Col +
']= REPLACE(REPLACE(CAST([' + @Col +
'] as nvarchar(max)) , NCHAR(1610), NCHAR(1740)),NCHAR(1603),NCHAR(1705)) '
)

FETCH NEXT FROM Table_Cursor INTO @Table,@Col
END CLOSE Table_Cursor DEALLOCATE Table_Cursor
END

pcseven
جمعه 21 آذر 1393, 09:39 صبح
نسخه بهینه شده کوئری فوق:
USE DatabaseName;

DECLARE @Table NVARCHAR(MAX),
@Col NVARCHAR(MAX)

DECLARE Table_Cursor CURSOR
FOR
--پيدا كردن تمام فيلدهاي متني تمام جداول ديتابيس جاري
SELECT a.name, --table
b.name --col
FROM sysobjects a,
syscolumns b
WHERE a.id = b.id
AND a.xtype = 'u' --User table
AND (
b.xtype = 99 --ntext
OR b.xtype = 35 -- text
OR b.xtype = 231 --nvarchar
OR b.xtype = 167 --varchar
OR b.xtype = 175 --char
OR b.xtype = 239 --nchar
)

OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @Table,@Col
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC (
'update [' + @Table + '] set [' + @Col +
']= REPLACE(REPLACE(CAST([' + @Col +
'] as nvarchar(max)) , NCHAR(1610), NCHAR(1740)),NCHAR(1603),NCHAR(1705)) WHERE CHARINDEX(NCHAR(1603),[' + @Col + '])>0 OR CHARINDEX(NCHAR(1610),[' + @Col + '])>0'
)
PRINT 'Table: ' + @Table +' Col: '+ @Col;
FETCH NEXT FROM Table_Cursor INTO @Table,@Col
END CLOSE Table_Cursor DEALLOCATE Table_Cursor

gbg
جمعه 21 آذر 1393, 12:33 عصر
ولی من همچنان منتظر راه حل نهایی هستم
با 2000 از این مشکلات نداشتم

pezhvakco
جمعه 21 آذر 1393, 22:53 عصر
شاید این :
1) کولیشن ها بیش تری کارایی شان برای ایندکس ها و مرتب سازی ها هستند (پشتیبانی از حروف "گچ پژ")
=>ساختار ستون ها رو به NVarChar ویرایش نمایید .
2) همه یا بخشی از داده های فعلی شما با ساختار عربی ذخیره شده است.
برای ویرایش این بخش (ویرایش "ی" عربی به "فارسی") با کدهای دوستان کار کنید و یا این

UpData TableName
Set ColName = Replace(colName, NCHAR(1610), NCHAR(1740))
Where ColName Like '%' + NCHAR(1610) + '%'

3) در برنامه خودتون (=سمت دلفی)، داده های رو به فارسی بگیرید=
تنظیمات خود دلفی بر روی "یونیکد" باشه
فونت های برنامه و اون ورودی داده ها (=ادیت ها) رو هم به پارسی ها مانند آن ها که با B شروع میشه (=BTitr, BTrafic)

gbg
شنبه 22 آذر 1393, 00:20 صبح
من فقط مورد سوم رو رعایت نکردم توکارم
حالا تو کاربعدی تست میکنم