我有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
- 并且是由用户生成的,并且有一个ID - foo_N_data
和bar_N_data
- 设置。
现在我想通过存储过程对这些表上的记录进行验证,以遵循我们无法控制的接收端的某些业务规则。
示例:
some_foo_data_1
是一个varchar(100)是一个名字,在我们的系统中它可以
在0到100个字符之间,但在接收端需要它
2到70个字符。some_bar_data_1
是小数(10.2),需要介于0和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
,但由于性能下降而放弃了它。
是否有一种有效且可重复使用的方法来验证来自动态tablas的数据?
注意:我们知道foo
和bar
的表结构如何,但我们不知道N值,因此我们无法直接调用它。< / p>
答案 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';