SQL Textptr

Textptr

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