Мой вариант:
CREATE FUNCTION dbo.fn_XmlEncode (@STR varchar(200))
RETURNS varchar(200)
AS
BEGIN
IF CHARINDEX('&', @STR) > 0
BEGIN
DECLARE @POS1 int, @POS2 int
SET @POS1 = CHARINDEX('&', @STR)
WHILE @POS1 > 0 BEGIN
IF SUBSTRING(@STR, @POS1, 5) <> '&'
SET @STR = LEFT(@STR, @POS1 - 1) + '&'
+ case when @POS1 < LEN(@STR) THEN SUBSTRING(@STR, @POS1 + 1, LEN(@STR) - @POS1) ELSE '' END
SET @POS2 = CHARINDEX('&', SUBSTRING(@STR, @POS1 + 5, LEN(@STR)))
IF @POS2 = 0 BREAK
SET @POS1 = @POS1 + 4 + @POS2
END
END
WHILE CHARINDEX('<', @STR) > 0
SET @STR = REPLACE(@STR, '<', '<')
WHILE CHARINDEX('>', @STR) > 0
SET @STR = REPLACE(@STR, '>', '>')
RETURN @STR
END
GO
-- Tests
SELECT dbo.fn_XmlEncode('&&'), dbo.fn_XmlEncode('&<&>"&&')