SQL Textptr
SQL
Download (.zip)
use pubs go
-- WRITETEXT with an unprotected text pointer. declare @mytextptr varbinary(16) select @mytextptr=TEXTPTR(pr_info) from pub_info where pub_id='9999'
IF @mytextptr IS NOT NULL WRITETEXT pub_info.pr_info @mytextptr WITH LOG 'Hello Again' go
-- WRITETEXT with a properly protected text pointer. BEGIN TRAN declare @mytextptr varbinary(16) select @mytextptr=TEXTPTR(pr_info) from pub_info (UPDLOCK) where pub_id='9999'
IF @mytextptr IS NOT NULL WRITETEXT pub_info.pr_info @mytextptr WITH LOG 'Hello Again'
COMMIT TRAN go
-- READTEXT with a protected text pointer. BEGIN TRAN declare @mytextptr varbinary(16),@sizeneeded int, @pat_offset int select @mytextptr=TEXTPTR(pr_info),@pat_offset=patindex('%Washington%',pr_info) - 1, @sizeneeded=datalength(pr_info) - patindex('%Washington%',pr_info) - 1 from pub_info (HOLDLOCK) where pub_id='0877'
IF @mytextptr IS NOT NULL AND @pat_offset >= 0 AND @sizeneeded IS NOT NULL READTEXT pub_info.pr_info @mytextptr @pat_offset @sizeneeded
COMMIT TRAN go
-- READTEXT in a loop to read chunks of text. -- Instead of using HOLDLOCK, use SET TRANSACTION ISOLATION LEVEL -- REPEATABLE READ (equivalent). Then set it back when done but -- be sure to do so in a separate batch. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ SET TEXTSIZE 100 —- Just for illustration; too small for —- real world. 4000 would be a better value. BEGIN TRAN
DECLARE @mytextptr varbinary(16), @totalsize int, @lastread int, @readsize int
SELECT @mytextptr=TEXTPTR(pr_info), @totalsize=DATALENGTH(pr_info), @lastread=0, -- Set the readsize to the smaller of the @@TEXTSIZE setting -- and the total length of the column @readsize=CASE WHEN (@@TEXTSIZE < DATALENGTH(pr_info)) THEN @@TEXTSIZE ELSE DATALENGTH(pr_info) END FROM pub_info WHERE pub_id='1622'
IF @mytextptr IS NOT NULL AND @readsize > 0 WHILE (@lastread < @totalsize) BEGIN READTEXT pub_info.pr_info @mytextptr @lastread @readsize IF (@@error <> 0) BREAK -- Break out of loop if an error on read -- Change offset to last char read SELECT @lastread=@lastread + @readsize -- If read size would go beyond end, adjust read size IF ((@readsize + @lastread) > @totalsize) SELECT @readsize=@totalsize - @lastread END COMMIT TRAN GO —- Set it back, but in a separate batch SET TRANSACTION ISOLATION LEVEL READ COMMITTED
-- UPDATETEXT to trim off the end. declare @mytextptr varbinary(16),@pat_offset int BEGIN TRAN select @mytextptr=TEXTPTR(pr_info), @pat_offset=patindex('%D.C.%',pr_info) - 1 + 4 -- for offset, subtract 1 for offset adjust but add 4 for length of "D.C." from pub_info (UPDLOCK) where pub_id='0877'
IF @mytextptr IS NOT NULL AND @pat_offset >= 0 UPDATETEXT pub_info.pr_info @mytextptr @pat_offset NULL WITH LOG
COMMIT TRAN go
-- UPDATETEXT to append to the end declare @mytextptr varbinary(16) BEGIN TRAN SELECT @mytextptr=TEXTPTR(pr_info) FROM pub_info (UPDLOCK) WHERE pub_id='0877'
IF @mytextptr IS NOT NULL UPDATETEXT pub_info.pr_info @mytextptr NULL NULL WITH LOG "Mary Doe is president of the company."
COMMIT TRAN go
-- UPDATETEXT to completely overwrite a text column. Alternative to WRITETEXT declare @mytextptr varbinary(16) BEGIN TRAN
SELECT @mytextptr=TEXTPTR(pr_info) FROM pub_info (UPDLOCK) WHERE pub_id='9999' IF @mytextptr IS NOT NULL UPDATETEXT pub_info.pr_info @mytextptr 0 NULL WITH LOG 'New text for 9999'
COMMIT TRAN go
-- UPDATETEXT to insert characters
DECLARE @mytextptr varbinary(16) BEGIN TRAN SELECT @mytextptr=TEXTPTR(pr_info) FROM pub_info (UPDLOCK) WHERE pub_id='0877'
IF @mytextptr IS NOT NULL UPDATETEXT pub_info.pr_info @mytextptr NULL NULL WITH LOG 'Kimberly Tripp is president of the company.' COMMIT TRAN
-- UPDATETEXT to insert vertical and horizontal tab
declare @mytextptr varbinary(16), @pat_offset int, @mystring char(2) BEGIN TRAN
SELECT @mystring= CHAR(13) + CHAR(9), -- Vertical tab is code point 13. Tab is 9. @pat_offset=patindex('%Kim%',pr_info) - 1, @mytextptr=TEXTPTR(pr_info) FROM pub_info (UPDLOCK) WHERE pub_id='0877'
IF @mytextptr IS NOT NULL AND @pat_offset >= 0 UPDATETEXT pub_info.pr_info @mytextptr @pat_offset 0 WITH LOG @mystring
COMMIT TRAN go
-- UPDATETEXT for Search and Replace. declare @mytextptr varbinary(16), @pat_offset int, @oldstring varchar(255), @newstring varchar(255), @sizeold int BEGIN TRAN
SELECT @oldstring='Tripp',@newstring='Tripp-Simonnet'
SELECT @sizeold=datalength(@oldstring), @pat_offset=patindex('%'+@oldstring+'%',pr_info) - 1, @mytextptr=TEXTPTR(pr_info) FROM pub_info (UPDLOCK) WHERE pub_id='0877'
IF @mytextptr IS NOT NULL AND @pat_offset >= 0 UPDATETEXT pub_info.pr_info @mytextptr @pat_offset @sizeold WITH LOG @newstring
COMMIT TRAN go
-- UPDATETEXT to copy and append another text column declare @target_textptr varbinary(16), @source_textptr varbinary(16) BEGIN TRAN
SELECT @target_textptr=TEXTPTR(pr_info) FROM pub_info (UPDLOCK) WHERE pub_id='0877' SELECT @source_textptr=TEXTPTR(pr_info) FROM pub_info (HOLDLOCK) WHERE pub_id='9952'
IF @target_textptr IS NOT NULL AND @source_textptr IS NOT NULL UPDATETEXT pub_info.pr_info @target_textptr NULL NULL WITH LOG pub_info.pr_info @source_textptr
COMMIT TRAN go
|