Проверка полей с динамическими именами таблиц - PullRequest
0 голосов
/ 10 мая 2018

У меня N таких таблиц:

foo_1_data
(
    id int,
    some_foo_data_1 varchar(100),
    some_foo_data_2 char(5)
)

foo_2_data
(
    id  int,
    some_foo_data_1 varchar(100),
    some_foo_data_2 char(5)
)

bar_1_data
(
    id int,
    some_bar_data_1 decimal(10,2),
    some_bar_data_2 datetime
)

bar_2_data
(
    id int,
    some_bar_data_1 decimal(10,2),
    some_bar_data_2 datetime
)

Таблицы основаны на разных данных - foo_data и bar_data - и генерируются пользователем, и есть идентификатор - foo_N_dataи bar_N_data - set.

Теперь я хочу реализовать проверку записей в этих таблицах с помощью хранимой процедуры, чтобы следовать определенным бизнес-правилам на стороне получателя, которые мы не можем контролировать.

Пример:

  1. some_foo_data_1 - это varchar (100) - это имя, и в нашей системе оно может быть от 0 до 100 символов, но на принимающей стороне оно должно быть от 2 до70 символов.
  2. some_bar_data_1 - десятичное число (10,2), и оно должно быть в диапазоне от 0 до 100 (скажем, в процентах)

Мы попытались реализовать хранимые процедуры, называемыенапример, sp_rule_name, который берет исходную таблицу и столбец и проверяет ее с помощью Dynamic SQL следующим образом:

EXEC('SELECT ' + @column_to_validate + ' FROM ' + @table_to_validate + ' WHERE ...')

Это создает повторно используемый код между различными процедурами проверки (по одной для каждойнабор данных - один для foo_data и один для bar_data), но код трудно понять и поддерживать из-за сочетания T-SQL и Dynamic SQL.Мы также пытались использовать functions в полях, но отбросили его из-за низкой производительности.

Существует ли эффективный и многократно используемый способ проверки данных из динамических таблиц?

Примечание: Мы знаем, как будет выглядеть структура таблицы как foo, так и bar, но мы не знаем значение N, поэтому мы не можем вызвать его напрямую.

1 Ответ

0 голосов
/ 10 мая 2018

Однажды я столкнулся с подобной ситуацией, и мне пришлось полагаться на динамический SQL для выполнения работы. Но устранять неисправности и даже читать это было больно. Я сделал небольшое изменение, и это помогло решить проблему устранения неполадок / чтения, особенно если это только SELECT в базовой таблице

Смотрите демо-версию

create proc sp_rule_name  @tblName varchar(100)
as 
begin
    declare @sql varchar(max);
    set @sql =' CREATE VIEW tempView  AS  SELECT * FROM '+ @tblName+ ' ;'
    exec (@sql)
    -- after this normal SQL syntax using tempView object for all sort of validations. No need for dynamic SQL
    select * from tempView;
end
go

create table foo_1_data (
    id int,
    some_foo_data_1 varchar(100),
    some_foo_data_2 char(5)
);
insert into foo_1_data values
(1,'345453','56666');



execute sp_rule_name N'foo_1_data';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...