验证具有动态 table 名称的字段

Validating fields with dynamic table names

我有 N 个这样的 table:

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
)

table基于不同的数据 - foo_databar_data - 由用户生成并且有一个 ID - foo_N_databar_N_data - 设置。

现在我想通过存储过程对这些 table 上的记录实施验证,以在接收端遵循某些我们无法控制的业务规则。

示例:

  1. some_foo_data_1 是一个 varchar(100) 是一个名字,在我们的系统中它可以是 介于 0 到 100 个字符之间,但在接收端需要 2 到 70 个字符。
  2. some_bar_data_1 是一个小数(10.2),它需要介于 0 和 100(假设它是一个百分比)

我们尝试并实施了存储过程,例如 sp_rule_name,它采用原始 table 和列并通过 Dynamic SQL 对其进行验证,如下所示:

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

这在不同的验证程序之间创建了可重用的代码(每个不同的数据集一个 - 一个用于 foo_data,一个用于 bar_data)但是代码很难理解和维护,因为T-SQLDynamic SQL 的混合体。我们还尝试在字段上使用 functions 但由于性能低下而放弃了它。

是否有一种有效且可重复使用的方法来验证来自动态表格的数据?

注意:我们知道 foobar 的 table 结构会是什么样子,但是我们不知道 N 值所以我们不能直接调用它.

曾经遇到过类似的情况,我不得不依靠动态 SQL 来完成工作。但是对其进行故障排除甚至阅读它都是一种痛苦。 我做了一个小改动,这有助于解决 troubleshooting/reading 问题,尤其是当底层 table

上只有 SELECT 时

See live demo

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';