Need to insert on each special character a escape character. As you said, you can stack a bunch of REPLACE
functions:
DECLARE @Prefix VARCHAR(100) = 'My%Prefix_'
DECLARE @Replaced VARCHAR(100) = REPLACE(REPLACE(REPLACE(REPLACE(@Prefix, '%', '\%'), '^', '\^'), '_', '\_'), '[', '\[')
SELECT
Original = @Prefix,
Translated = @Replaced
Result:
Original Translated
My%Prefix_ My\%Prefix\_
Then use the ESCAPE
clause for the LIKE to tell the engine that your character is the escape indicator:
SELECT *
FROM Logs
WHERE IDString LIKE @Replaced + '[-]%'
ESCAPE '\'
You could also create a scalar function with the replaces:
CREATE FUNCTION dbo.ufnEscapeLikeSpecialCharacters(@Input VARCHAR(100), @EscapeCharacter CHAR)
RETURNS VARCHAR(100)
AS
BEGIN
RETURN REPLACE(REPLACE(REPLACE(REPLACE(@Input, '%', @EscapeCharacter + '%'), '^', @EscapeCharacter + '^'), '_', @EscapeCharacter + '_'), '[', @EscapeCharacter + '[')
END
And then use it like:
DECLARE @Prefix VARCHAR(100) = 'My%Prefix_'
SELECT *
FROM Logs
WHERE IDString LIKE dbo.ufnEscapeLikeSpecialCharacters(@Prefix, '\') + '[-]%'
ESCAPE '\'