Переменные
недопустимы в именах серверов, схем и таблиц, а также в нескольких других местах (например, в ALTER, CREATE, DROP ..etc).
В вашем случае вы пытаетесь использовать его в имени схемы, чтобы использовать его следующим образом, у вас будет два варианта.
Опция 1:
Определите каждый оператор выбора и используйте IF, чтобы получить нужный оператор выбора на основе ввода переменной.
Пример:
DECLARE
@max_date DATETIME2
, @DatabaseSchema VARCHAR(max) = 'SALES_MART'
SET @max_date = CASE @DatabaseSchema
WHEN 'SALES_MART' THEN (SELECT MAX(SaleDate) FROM SALES_MART.SalesReport WHERE Categoryname = 'Asia')
WHEN 'SALES_MART_TWO' THEN (SELECT MAX(SaleDate) FROM SALES_MART_TWO.SalesReport WHERE Categoryname = 'Asia')
ELSE GETDATE()
END
SET @max_date = CASE WHEN @max_date IS NULL THEN GETDATE() ELSE @max_date END -- You can replace it with ISNULL(@max_date, GETDATE())
SELECT @max_date
Вариант 2 (Не всегда рекомендуется, так как имеет свои собственные риски):
Вместо этого используйте daynamic sql.
DECLARE
@max_date DATETIME2
, @DatabaseSchema VARCHAR(max) = 'SALES_MART'
, @sql VARCHAR(max) = ''
SET @sql = 'ISNULL( (SELECT MAX(SaleDate) FROM @DatabaseSchema.SalesReport WHERE Categoryname = ''Asia''), GETDATE())'
SET @sql = REPLACE(@sql, '@DatabaseSchema', @DatabaseSchema)
EXEC (@sql)