create procedure sys.sp_MSsetcontext_internalcaller @onoff bit -- 1 to turn on
as
begin
declare @cur_context varbinary(128)
declare @cur_context_second_byte binary(1)
declare @bitmask tinyint
-- First Byte
-- bit to set: snapshot=1, logreader=2, distrib=4, merge=8,
-- replication_agent=16, merge_identityrange_alterconstraint=32
-- bypasswholeddleventbit=64, bypassreplicateddleventbit=128
-- Second Byte
-- bit to set: internalcaller = 1
if @onoff=1
set @bitmask=1
else
set @bitmask=255-1
-- get the current context_info. remember we only want to modify a bit without changing the rest of the info
select @cur_context = isnull(context_info(),0x00)
-- get the second byte out.
select @cur_context_second_byte = substring(@cur_context, 2, 1)
-- set the appropriate bit in this one byte (leaving other bits unchanged).
if @onoff=1
select @cur_context_second_byte = (convert(tinyint,@cur_context_second_byte) | @bitmask)
else
select @cur_context_second_byte = (convert(tinyint,@cur_context_second_byte) & @bitmask)
-- replace the first byte of the 128 byte binary variable, so that now it has the appropriate bit set.
select @cur_context = convert(varbinary(128),stuff (convert(binary(128), @cur_context), 2, 1, @cur_context_second_byte))
-- set the context_info again with the new binary(128) value.
set context_info @cur_context
if @@error <> 0
return 1
return 0
end