بروزرسانی انواع داده MAX در SQL Server: راهنمای جامع UPDATE .WRITE برای varchar(max), nvarchar(max) و varbinary(max)
انواع داده MAX در SQL Server، شامل varchar(max)
، nvarchar(max)
و varbinary(max)
، قابلیت ذخیرهسازی حجم زیادی از داده تا 2 گیگابایت را دارند. نیاز به درج، حذف یا بروزرسانی این نوع دادهها به کرات پیش میآید.
در نسخههای قدیمیتر SQL Server، عبارات UPDATETEXT
و WRITETEXT
برای بروزرسانی ستونهای متنی بزرگ استفاده میشدند، اما این روشها اکنون منسوخ شدهاند.
از SQL Server 2005 به بعد، عبارت UPDATE .WRITE
برای انجام بروزرسانیهای جزئی روی انواع داده با حجم بالا معرفی شد. این دستور یک راهکار کارآمد برای تغییر اشیاء بزرگ (LOBs) فراهم میکند، بدون اینکه نیاز باشد کل داده به کلاینت بازیابی شده و سپس کل داده بروزرسانی شده به سرور بازگردانده شود.
دستور UPDATE .WRITE
سه آرگومان اصلی میپذیرد: expression
، offset
و length
.
expression
: مقدار جدیدی که قرار است در ستون کپی شود.offset
: موقعیت شروعی که مقدار جدید از آنجا نوشته میشود.length
: طول قسمتی از داده که قرار است جایگزین شود.
ساختار کلی این دستور به شکل زیر است:
UPDATE <table_name> SET <column_name>.WRITE ( expression , offset , length )
این ساختار به ما امکان میدهد تا به صورت دقیق بخشهای خاصی از دادههای بزرگ را بدون تأثیر بر بقیه محتوا بروزرسانی کنیم. این ویژگی برای مدیریت بهینه حافظه و عملکرد در کار با دادههای حجیم بسیار مفید است.
سناریو ۱: افزودن متن به ابتدای ستون varchar(max)
برای نمایش عملکرد این دستور، ابتدا یک جدول نمونه ایجاد کرده و تعدادی داده در آن درج میکنیم:
CREATE TABLE dbo.TestUpdateMax
(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
ValueVarcharMax VARCHAR(MAX),
ValueNVarCharMax NVARCHAR(MAX),
ValueVarBinaryMax VARBINARY(MAX)
);
GO
INSERT INTO dbo.TestUpdateMax (ValueVarcharMax)
VALUES ('This is some test data.');
GO
SELECT * FROM dbo.TestUpdateMax;
GO
اکنون، برای افزودن متن به ابتدای ستون ValueVarcharMax
، از UPDATE .WRITE
با offset = 0
و length = 0
استفاده میکنیم. در این حالت، length = 0
به SQL Server میگوید که هیچ بخشی از متن موجود جایگزین نشود، بلکه فقط expression
در موقعیت offset
درج شود:
UPDATE dbo.TestUpdateMax
SET ValueVarcharMax.WRITE ('Some new data. ', 0, 0)
WHERE ID = 1;
GO
SELECT * FROM dbo.TestUpdateMax;
GO
خروجی پس از این بروزرسانی به شکل زیر خواهد بود:
Some new data. This is some test data.
همانطور که مشاهده میکنید، متن جدید به ابتدای دادههای موجود اضافه شده است. این روش بهینهای برای درج اطلاعات در ابتدای رشتههای بزرگ است.
سناریو ۲: جایگزینی متن در ستون varchar(max)
در این بخش، به جایگزینی بخشی از متن در میانه رشته میپردازیم. قصد داریم کلمه “some” را با “a lot of” جایگزین کنیم.
ابتدا، دادههای فعلی را بررسی میکنیم:
SELECT ValueVarcharMax FROM dbo.TestUpdateMax WHERE ID = 1;
GO
فرض میکنیم خروجی فعلی Some new data. This is some test data.
باشد. برای جایگزینی “some” که از کاراکتر دهم (این موقعیت بر اساس اندیسگذاری صفر است) شروع میشود و چهار کاراکتر طول دارد، از offset = 10
و length = 4
استفاده میکنیم:
UPDATE dbo.TestUpdateMax
SET ValueVarcharMax.WRITE ('a lot of', 10, 4)
WHERE ID = 1;
GO
SELECT * FROM dbo.TestUpdateMax;
GO
پس از اجرای این دستور، متن بروزرسانی شده به این شکل خواهد بود:
Some new data. This is a lot of test data.
با این روش، میتوانیم به سادگی بخشهای خاصی از یک رشته بلند را بدون نیاز به بازخوانی و نوشتن مجدد کل آن، تغییر دهیم.
سناریو ۳: درج متن در میانه ستون varchar(max)
در این سناریو، قصد داریم متنی را در میانه رشته موجود درج کنیم. میخواهیم “very ” را قبل از عبارت “a lot of” وارد کنیم.
متن فعلی ما Some new data. This is a lot of test data.
است. برای درج “very ” در موقعیت مناسب (قبل از “a lot of”)، offset
را روی موقعیت شروع “a lot of” (در اینجا کاراکتر 22) و length
را روی 0
تنظیم میکنیم تا هیچ متنی جایگزین نشود و فقط متن جدید درج گردد:
UPDATE dbo.TestUpdateMax
SET ValueVarcharMax.WRITE ('very ', 22, 0)
WHERE ID = 1;
GO
SELECT * FROM dbo.TestUpdateMax;
GO
نتیجه این بروزرسانی به صورت زیر خواهد بود:
Some new data. This is very a lot of test data.
این مثال نشان میدهد که چگونه میتوان با تنظیم length = 0
، دادهها را در هر نقطهای از رشتههای varchar(max)
درج کرد.
سناریو ۴: بروزرسانی ستون nvarchar(max)
در این بخش به بروزرسانی ستون nvarchar(max)
میپردازیم. ابتدا دادههای جدول را برای این ستون بازنشانی میکنیم:
UPDATE dbo.TestUpdateMax
SET ValueNVarCharMax = 'Some Unicode data. This is for nvarchar(max) updates.'
WHERE ID = 1;
GO
SELECT ValueNVarCharMax FROM dbo.TestUpdateMax WHERE ID = 1;
GO
برای افزودن متن “New Unicode. ” به ابتدای ستون ValueNVarCharMax
، از UPDATE .WRITE
با offset = 0
و length = 0
استفاده میکنیم. نکته مهم در اینجا این است که برای رشتههای Unicode باید از پیشوند N
استفاده شود:
UPDATE dbo.TestUpdateMax
SET ValueNVarCharMax.WRITE (N'New Unicode. ', 0, 0)
WHERE ID = 1;
GO
SELECT ValueNVarCharMax FROM dbo.TestUpdateMax WHERE ID = 1;
GO
نتیجه این عملیات به شرح زیر خواهد بود:
New Unicode. Some Unicode data. This is for nvarchar(max) updates.
این سناریو نشان میدهد که UPDATE .WRITE
به خوبی با دادههای Unicode در nvarchar(max)
کار میکند، تنها با این تفاوت که باید پیشوند N
برای رشتههای ورودی استفاده شود.
سناریو ۵: بروزرسانی ستون varbinary(max)
در ادامه، به بروزرسانی ستون varbinary(max)
میپردازیم. مانند موارد قبلی، ابتدا دادههای این ستون را بازنشانی میکنیم:
UPDATE dbo.TestUpdateMax
SET ValueVarBinaryMax = 0x0102030405060708090A0B0C0D0E0F
WHERE ID = 1;
GO
SELECT ValueVarBinaryMax FROM dbo.TestUpdateMax WHERE ID = 1;
GO
برای افزودن بایتهای 0x101112
به ابتدای ستون ValueVarBinaryMax
، از UPDATE .WRITE
با offset = 0
و length = 0
استفاده میکنیم:
UPDATE dbo.TestUpdateMax
SET ValueVarBinaryMax.WRITE (0x101112, 0, 0)
WHERE ID = 1;
GO
SELECT ValueVarBinaryMax FROM dbo.TestUpdateMax WHERE ID = 1;
GO
نتیجه این عملیات به صورت زیر خواهد بود:
0x1011120102030405060708090A0B0C0D0E0F
در این حالت نیز، همانند رشتهها، بایتهای جدید به ابتدای دادههای باینری اضافه شدهاند. این قابلیت برای مدیریت و بروزرسانی جزئی دادههای باینری حجیم بسیار کارآمد است.
نکات مهم و مشکلات احتمالی در استفاده از UPDATE .WRITE
هنگام کار با دستور UPDATE .WRITE
، توجه به نکات زیر ضروری است:
-
آرگومانهای
offset
وlength
درUPDATE .WRITE
همیشه بر اساس تعداد بایتها اندازهگیری میشوند.برای ستونهای
varchar(max)
، تعداد بایتها برابر با تعداد کاراکترها است.اما برای ستونهای
nvarchar(max)
، هر کاراکتر دو بایت حجم دارد، بنابراین برای محاسبهoffset
وlength
باید تعداد کاراکترها را در دو ضرب کنید. مثلاً اگر میخواهید از کاراکتر دهم شروع کنید،offset
باید20
باشد. -
ارسال یک رشته خالی (به عنوان مثال،
''
برایvarchar(max)
یاN''
برایnvarchar(max)
) به عنوانexpression
زمانی کهlength
بیشتر از صفر باشد، منجر به حذف دادهها میشود. این روش میتواند برای حذف بخشی از یک رشته بزرگ مفید باشد. -
تمامی عملیات
UPDATE .WRITE
در یک تراکنش (Transaction) کامل انجام میشوند. این به معنای این است که اگر تراکنش ناموفق باشد، تغییرات برگشت داده میشوند و دادهها در وضعیت قبلی خود باقی میمانند. -
استفاده مکرر از
UPDATE .WRITE
برای انجام بروزرسانیهای جزئی ممکن است منجر به تکهتکهشدن (fragmentation) فضای ذخیرهسازی دادههای بزرگ شود. برای کاهش این مشکل، در صورت امکان، دادهها را به صورت کامل بازنویسی کنید یا استراتژیهایی برای بازسازی ایندکسها یا سازماندهی مجدد دادهها در نظر بگیرید.
با در نظر گرفتن این نکات، میتوانید از UPDATE .WRITE
به طور موثر و کارآمد برای مدیریت انواع داده MAX
در SQL Server استفاده کنید.