Использование: SQL Server 2016+
Oracle поддерживает как общедоступные, так и частные синонимы. Т.е. вы можете настроить синоним так, чтобы он был доступен для всех подключений или только для текущего подключения - например, временная таблица.
Я знаю, что SQL-сервер не поддерживает частные синонимы, но я ищу наиболее эффективные альтернативы.
В качестве примера структуры данных:
CREATE TABLE [dbo].[Session1] ([ID] [UNIQUEIDENTIFIER] NOT NULL, [Val1] [INT] NULL, [Val2] [INT] NULL);
GO
CREATE TABLE [dbo].[Session2] ([ID] [UNIQUEIDENTIFIER] NOT NULL, [Val1] [INT] NULL, [Val2] [INT] NULL);
GO
CREATE TABLE [dbo].[Session3] ([ID] [UNIQUEIDENTIFIER] NOT NULL, [Val1] [INT] NULL, [Val2] [INT] NULL);
GO
CREATE SYNONYM MySession FOR dbo.Session1;
NB. Это только пример, таблицы содержат много строк, и у нас есть клиенты с тысячами одновременных сеансов.
Теперь я мог получить доступ к Session1
таблице как MySession
, но, к сожалению, так будет и любое другое соединение.
DECLARE @SessionID NVARCHAR(255)
, @strSQL NVARCHAR(MAX);
SET @SessionID = N'1';
SET @strSQL = 'SELECT * FROM dbo.Session' + @SessionID;
EXEC sp_executesql @stmt = @strSQL;
Динамический SQL, вероятно, самый эффективный, но по прошлому опыту могу сказать, что он требует больше усилий как для кода, так и для поддержки.
Мы также протестировали секционированные представления и таблицы, обе из которых имеют недостатки.
Исходя из предположения, что я не первый человек, использующий этот стиль структуры данных, я ищу несколько советов по дополнительным подходам, которые я, возможно, не рассмотрел. Есть ли другие варианты?