SQL Text in row data

Text in row data

USE pubs
GO

-- This example shows an attempt to acquire 
-- a text pointer without an explicit transaction:
CREATE TABLE t1 (c1 int, c2 text)
EXEC sp_tableoption 't1', 'text in row', 'ON'
INSERT INTO t1 SELECT 1, 'hello there'
GO

DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(c2) FROM t1 WHERE c1 = 1
READTEXT t1.c2 @ptrval 0 1

-- Attempting to do the same text pointer assignment 
-- and READTEXT inside a user-defined transaction succeeds
BEGIN TRAN
DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(c2) FROM t1 WHERE c1 = 1
READTEXT t1.c2 @ptrval 0 1
COMMIT TRAN
GO
-- To see that the shared locks are taken and 
-- held automatically, we can execute the 
-- same code shown earlier for the text data 
-- in the pub_info table, which was not stored 
-- in the row itself. 

-- If you actually ran that earlier example, 
-- the row with pub_id 9999 is now gone, 
-- so change the code to look for a row with pub_id 1756. I also must first enable the text in row option for the pub_info table and then use an explicit transaction.

-- WRITETEXT with text-in-row data
EXEC sp_tableoption pub_info, 'text in row', 'ON'
GO

BEGIN TRAN
DECLARE @mytextptr varbinary(16)
SELECT @mytextptr=TEXTPTR(pr_info) 
    FROM pub_info WHERE pub_id='1756' 
WAITFOR DELAY '00:00:20'
-- During the delay, you can attempt to delete
-- this row in another Query Analyzer connection:
--        DELETE FROM pub_info WHERE pub_id='1756' 
IF @mytextptr IS NOT NULL
    WRITETEXT pub_info.pr_info @mytextptr 'Hello Again'
COMMIT TRAN
GO

-- If the isolation level of the transaction is 
-- READ UNCOMMITTED, any text pointer obtained 
-- from a table with text in row enabled is 
-- considered read-only and cannot be used to update 
-- LOB values. They can be used only to read the data. 
-- The example below creates a table with in-row text 
-- data and then sets the transaction isolation levelt
-- to READ UNCOMMITTED. 

-- You can see that the READTEXT succeeds 
-- but the WRITETEXT does not.

CREATE TABLE t1 (c1 int, c2 text)
EXEC sp_tableoption 't1', 'text in row', 'ON'
INSERT INTO t1 SELECT 1, 'hello there'
GO

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO

BEGIN TRAN
DECLARE @ptr varbinary(16)
SELECT @ptr=textptr(c2) FROM t1 WHERE c1=1
READTEXT t1.c2 @ptr 0 5
COMMIT TRAN
GO

BEGIN TRAN
DECLARE @ptr varbinary(16)
SELECT @ptr=textptr(c2) FROM t1 WHERE c1=1
WRITETEXT t1.c2 @ptr 'xx'
COMMIT TRAN
GO