Я бы также рекомендовал проект с одной таблицей / сегментированным языком, в котором все языки хранятся в одной таблице со столбцом языка.
Динамический SQL может быть потенциально уязвим для внедрения SQL. Если переменная @LANG не может быть доверенной (или если схема и таблица должны быть проверены, чтобы быть допустимой комбинацией), вы можете проверить ее по sys.schemas, используя такую технику:
DECLARE @template AS varchar(max)
SET @template = 'SELECT * FROM {object_name}'
DECLARE @object_name AS sysname
SELECT @object_name = QUOTENAME(s.name) + '.' + QUOTENAME(o.name)
FROM sys.objects o
INNER JOIN sys.schemas s
ON s.schema_id = o.schema_id
WHERE o.object_id = OBJECT_ID(QUOTENAME(@LANG) + '.[TestingLanguagesInNameSpacesDelMe]')
IF @object_name IS NOT NULL
BEGIN
DECLARE @sql AS varchar(max)
SET @sql = REPLACE(@template, '{object_name}', @object_name)
EXEC (@sql)
END
Теперь у вас есть мощь и гибкость динамического SQL, но он не уязвим для инъекций.