验证具有动态 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_data
和 bar_data
- 由用户生成并且有一个 ID - foo_N_data
和 bar_N_data
- 设置。
现在我想通过存储过程对这些 table 上的记录实施验证,以在接收端遵循某些我们无法控制的业务规则。
示例:
some_foo_data_1
是一个 varchar(100) 是一个名字,在我们的系统中它可以是
介于 0 到 100 个字符之间,但在接收端需要
2 到 70 个字符。
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-SQL
和 Dynamic SQL
的混合体。我们还尝试在字段上使用 functions
但由于性能低下而放弃了它。
是否有一种有效且可重复使用的方法来验证来自动态表格的数据?
注意:我们知道 foo
和 bar
的 table 结构会是什么样子,但是我们不知道 N 值所以我们不能直接调用它.
曾经遇到过类似的情况,我不得不依靠动态 SQL 来完成工作。但是对其进行故障排除甚至阅读它都是一种痛苦。
我做了一个小改动,这有助于解决 troubleshooting/reading 问题,尤其是当底层 table
上只有 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';
我有 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_data
和 bar_data
- 由用户生成并且有一个 ID - foo_N_data
和 bar_N_data
- 设置。
现在我想通过存储过程对这些 table 上的记录实施验证,以在接收端遵循某些我们无法控制的业务规则。
示例:
some_foo_data_1
是一个 varchar(100) 是一个名字,在我们的系统中它可以是 介于 0 到 100 个字符之间,但在接收端需要 2 到 70 个字符。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-SQL
和 Dynamic SQL
的混合体。我们还尝试在字段上使用 functions
但由于性能低下而放弃了它。
是否有一种有效且可重复使用的方法来验证来自动态表格的数据?
注意:我们知道 foo
和 bar
的 table 结构会是什么样子,但是我们不知道 N 值所以我们不能直接调用它.
曾经遇到过类似的情况,我不得不依靠动态 SQL 来完成工作。但是对其进行故障排除甚至阅读它都是一种痛苦。 我做了一个小改动,这有助于解决 troubleshooting/reading 问题,尤其是当底层 table
上只有 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';