Вы не можете сделать следующее в простом SQL (игнорируя все накладные расходы ADO.Net):
DECLARE @SchemaName sysname
SET @SchemaName = 'dbo'
SELECT major FROM @SchemaName.[version]
И причина проста. SQL хочет после FROM
имя . То, что вы пытаетесь дать, это строка . SQL Server не случайно не начинает пиринг внутри строк, чтобы посмотреть, не похожи ли они на какую-то другую конструкцию.
Для вашего санитарного запроса, предполагая, что вы сохраняете имена схем в здравом уме, просто используйте простое регулярное выражение в имени схемы, прежде чем доверять ему (например, ^[A-Z][A-Z0-9]+$
должно быть достаточно для большинства применений). Убедитесь, что вы используете белый (разрешенные символы), а не черный список.