Использование: 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, вероятно, наиболее эффективен, но из прошлого опыта могу сказать, что он требует больше усилий как для кода, так и для поддержки.
Мы также протестировали секционированные представления и таблицы, оба из которых имеют недостатки.
Работая в предположении, что я не первый, кто имеет такой стиль структуры данных, я ищу несколько советов по дополнительным подходам, которые я, возможно, не рассмотрел. Есть ли другие доступные варианты?