ورود

View Full Version : درخواست تابع یکسان سازی ی و ک



Iran58
پنج شنبه 22 آذر 1397, 12:48 عصر
سلام
دوستان یک بانک اطلاعاتی داریم که حاوی 20 جدول است
اما داده های واردی در جداول برای ی و ک یکسان نمی باشد
حال من تابعی می خواهم که همه ی وک را یکسان کند
باید چه دستوری بنویسم

Iran58
پنج شنبه 22 آذر 1397, 13:19 عصر
سلام
من تابع زیر رابدست اوردم

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



اما مشکلی که دارم اینه این دستورات فقط برای جداولی که اسکما dbo داره درست کار میکنه
اما برای جداولی که اسکما dbo ندارند ارور زیر را میدهد


Msg 208, Level 16, State 1, Line 1 Invalid object name 'City'. Table: City Col: LatinName



کد را باید چگونه تغییر بدهم

hamid_hr
سه شنبه 27 آذر 1397, 09:41 صبح
اینطوری فک کنم درسته


DECLARE @Table NVARCHAR(MAX) ,
@Col NVARCHAR(MAX) ,
@schma nvarchar(max)

DECLARE Table_Cursor CURSOR
FOR
--پيدا كردن تمام فيلدهاي متني تمام جداول ديتابيس جاري
SELECT a.name, --table
b.name --col
,s.name
FROM sysobjects a,
syscolumns b
,sys.tables t,
sys.schemas s
WHERE a.id = b.id and t.object_id = a.id
and s.schema_id = t.schema_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, @schma
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC (
'update ['+ @schma +'].[' + @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

bimedana
سه شنبه 27 آذر 1397, 10:20 صبح
برای من هم این مشکل هست لطفا راهنمابی بفرمایید

Iran58
سه شنبه 27 آذر 1397, 10:59 صبح
سلام
باسپاس ازجوابتان
وقتی کد را اجرا میکنم ارور زیر را میدهد


Msg 16924, Level 16, State 1, Line 37
Cursorfetch: The number of variables declared in the INTO list must match that of selected columns.

hamid_hr
سه شنبه 27 آذر 1397, 11:23 صبح
این خطو تغییر بدین
FETCH NEXT FROM Table_Cursor INTO @Table,@Col , @schma

rahmatipoor
پنج شنبه 29 آذر 1397, 10:00 صبح
پروژه سی شارپ: اصلاح حروف "ک" و "ی" عربی توی همه جدولهای دیتابیس SQL با یک کلیک


توضیح :

با کلیک روی دکمه اصلاح حروف یک پروسیجر توی دیتابیس ایجاد میشه ، پروسیجر اجرا میشه و بعدش هم حذف میشه

با استفاده از این پروژه حروف عربی از قبیل "ک" و "ی" عربی (که با استاندارد فارسی فرق داره ) و توی جدولهای مختلف دیتابیس وارد شده و باعث ایجاد مشکل موقع جستجو در اطلاعات میشه به صورت اتوماتیک با حروف صحیح فارسی متناظر replace میشه .

فقط باید توی کلاس clsAccessData توی خط اول ( رشته ConStr ) رشته اتصال خودتون رو جایگزین کنید.
string ConStr = @"Data Source=.\InstanceName; database = DataBaseName ; Integrated Security=True";


از دات نت بار 2 هم استفاده شده که dll اون توی مسیر bin توی پروژه هست و توی پروژه های خودتون باید به رفرنسهاتون اضافه بشه.

لینک دانلود پروژه
(http://s9.picofile.com/file/8326527226/Change_Arabic_CodePage.rar.html)

rahmatipoor
پنج شنبه 29 آذر 1397, 10:05 صبح
برای اس کیو ال هم میتونید از این استور پروسیجر که آقای یوسف زالی (http://barnamenevis.org/member.php?70247-%DB%8C%D9%88%D8%B3%D9%81-%D8%B2%D8%A7%D9%84%DB%8C) عزیز تهیه کردند استفاده کنید. (توی این لینک) (http://barnamenevis.org/showthread.php?320589-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B5%D9%84%D8%A7%D8%AD-%DA%A9%D9%84%D9%85%D8%A7%D8%AA-%D8%B9%D8%B1%D8%A8%DB%8C-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3&p=1406411&viewfull=1#post1406411)

Iran58
دوشنبه 15 بهمن 1397, 10:25 صبح
اینطوری فک کنم درسته


DECLARE @Table NVARCHAR(MAX) ,
@Col NVARCHAR(MAX) ,
@schma nvarchar(max)

DECLARE Table_Cursor CURSOR
FOR
--پيدا كردن تمام فيلدهاي متني تمام جداول ديتابيس جاري
SELECT a.name, --table
b.name --col
,s.name
FROM sysobjects a,
syscolumns b
,sys.tables t,
sys.schemas s
WHERE a.id = b.id and t.object_id = a.id
and s.schema_id = t.schema_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, @schma
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC (
'update ['+ @schma +'].[' + @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


سلام
اگر بخواهم برای یک جدول خاص اینکار را انجام بدهم باید چه کدی بنویسم

farhad_shiri_ex
دوشنبه 15 بهمن 1397, 11:21 صبح
سلام
اگر بخواهم برای یک جدول خاص اینکار را انجام بدهم باید چه کدی بنویسم


این امتحان کنید!


DECLARE @Table NVARCHAR(MAX) ,
@Col NVARCHAR(MAX) ,
@schma nvarchar(max)
@Table = "youTable"
@Col = "columnName"
@schma = "dbo"

EXEC (
'update ['+ @schma +'].[' + @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'
)