Существует обходной путь, который будет работать следующим образом, хотя он не обязательно оптимален. Для этого вам потребуется создать хранимую процедуру для ВСТАВКИ ваших данных, хранимую процедуру для ОБНОВЛЕНИЯ ваших данных (при необходимости) и ПРОСМОТР для извлечения ваших данных. По сути, вы будете воссоздавать функциональность секционирования SQL Server на упрощенном уровне.
Сначала создайте количество баз данных, с которыми вы хотите работать. В этом примере давайте используем четыре базы данных с именами DB1, DB2, DB3 и DB4.
Как будет работать ваша хранимая процедура INSERT, зависит от того, насколько вы будете делать свой код. Я предпочитаю что-то, эмулирующее функциональность реальной логики секционирования, но вы можете создать что-то, что просто вставляется в первую неполную базу данных.
Для этого примера давайте создадим SEQUENCE
, чтобы контролировать, какая база данных вставленав. SEQUENCE
похоже на идею поля IDENTITTY
, но оно не привязано к таблице. Чтобы создать последовательность, используйте такой код:
CREATE SEQUENCE MySequence as bigint
START AT 1
INCREMENT BY 1
Чтобы выполнить вставку, используйте значение последовательности, чтобы определить, в какую базу данных будет вставлена. В этом случае я буду использовать функциональность по модулю в SQL Server, но вы также можете разделить ее на диапазоны номеров.
DECLARE @db int,
@NewSeq bigint
SET @NewSeq = NEXT VALUE FOR dbo.MySequence
SET @db = (@NewSeq % 4) + 1 -- you'll see why in a moment
Можно подумать, что использование %
как возвращение остатка после целочисленного деления. Итак, если вы вычислите 14 % 4
, вы получите значение 2, поскольку четыре входит в 14 три раза, оставляя остаток от двух. Для любого целого числа, деление по модулю на четыре вернет значение ноль, один, два или три.
Теперь вы знаете, в какую базу данных вставлять. Вы можете использовать оператор CASE
и выполнять разные биты кода или хранимые процедуры для каждой базы данных для вставки, но я предпочитаю использовать для этого код динамический SQL , например:
DECLARE @SQL varchar(1000)
SET @SQL = 'INSERT INTO [DB' + Cast(@db as char(1)) + '].'[dbo].MyTable (a,b,c) VALUES (''' + <logtext> + ''', GETDATE(), 1)'
EXEC (@sql)
Этого должно хватить, чтобы начать работу с этой идеей.