SQL Server эквивалентен частному синониму в Oracle - PullRequest
1 голос
/ 03 апреля 2019

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

Мы также протестировали секционированные представления и таблицы, оба из которых имеют недостатки.

Работая в предположении, что я не первый, кто имеет такой стиль структуры данных, я ищу несколько советов по дополнительным подходам, которые я, возможно, не рассмотрел. Есть ли другие доступные варианты?

...