Increase your @sql variable's length to MAX like
DECLARE @sql varchar(MAX)
You have defined 20 length which is not enough to store whole query in that variable. Also remove @clause variable and change your code like below. You can also print whole query by print @sql
and check what is wrong in that.
DECLARE @var varchar(500)
DECLARE @sql varchar(MAX)
SET @var= '1,2,3'
SET @sql = 'SELECT [ID],
[SOURCE],
[LAST_KEY]
FROM [oms].[dbo].[MIGRATION]'
IF @var IS NOT NULL AND @var <> ''
BEGIN
SET @sql = @sql + ' WHERE ID IN ('+ @var + ')'
END
EXEC (@sql)