使用动态表名验证字段

时间:2018-05-10 12:42:46

标签: sql-server tsql sql-server-2005

我有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_databar_data - 并且是由用户生成的,并且有一个ID - foo_N_databar_N_data - 设置。

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

示例:

  1. some_foo_data_1是一个varchar(100)是一个名字,在我们的系统中它可以 在0到100个字符之间,但在接收端需要它 2到70个字符。
  2. some_bar_data_1是小数(10.2),需要介于0和0之间 100(让我们说它是一个百分比)
  3. 我们尝试并实施了名为sp_rule_name的存储过程,它采用原始表和列,并通过Dynamic SQL验证它,如下所示:

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

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

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

    注意:我们知道foobar的表结构如何,但我们不知道N值,因此我们无法直接调用它。< / p>

1 个答案:

答案 0 :(得分:1)

一旦遇到类似的情况,我不得不依靠动态SQL来完成工作。但排除故障,甚至阅读它都是一件痛苦的事。 我做了一个小改动,这有助于解决故障排除/阅读问题,特别是如果它只是基础表上的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';