نسخه بهینه شده که الان نوشتم:
CREATE PROCEDURE ChangeCodePageNew
@TableName VARCHAR(100)
AS
DECLARE @ColHolder CHAR(1) = '@'
DECLARE @Replace VARCHAR(4000) = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(R EPLACE(REPLACE([' + @ColHolder + '], NCHAR(1571), NCHAR(1575)), NCHAR(1573), NCHAR(1575)), NCHAR(1609), NCHAR(1610)), NCHAR(1746), NCHAR(1610)), NCHAR(1574), NCHAR(1610)), NCHAR(1572), NCHAR(1608)), NCHAR(1729), NCHAR(1607)), NCHAR(1603), NCHAR(1705))'
DECLARE @X VARCHAR(MAX) = ''
;WITH CTE AS (
SELECT A.name TBL, B.name COL
FROM sys.tables A
JOIN sys.columns B ON A.object_id = B.object_id and ISNULL(@TableName, '') IN ('', A.name)
JOIN sys.types C ON B.system_type_id = C.system_type_id AND C.name IN ('char', 'nchar', 'varchar', 'nvarchar')
)
SELECT @X +=
'update ' + TBL + CHAR(13)
+ 'set' + CHAR(13)
+ SUBSTRING(
(
SELECT ', ' + COL + ' = ' + REPLACE(@Replace, @ColHolder, COL)
FROM CTE Y
WHERE X.TBL = Y.TBL
FOR XML PATH('')
), 2, 1000000) + CHAR(13)
+ CHAR(13)
FROM CTE X
GROUP BY TBL
EXEC(@X)
هرجا توضیح لازم بود بگید، اضافه کنم که به نظرم چک کردن وجود فیلدی که باید آپدیت بشه خودش به اندازه جایگزینی زمان بره، و بهینه سازی در اون حد از نظرم بی فایده اومد.
موفق باشید.
پ.ن:
ویرایشگر نادون این سایت بعضی جاها فاصله می ندازه، در هنگام کپی، حواستون باشه!





پاسخ با نقل قول