我有以下任务想要使用SQL Server的查询和/或存储过程来解决,如果有人能给我一些指示,我真的很感激。
基本上我们有一个基于SQL Server的数据仓库。我想验证某些表中的列,以确保这些列中的值有效。
示例如下:
Table1 ColumnsToValidate
指定需要验证值的表/列。在示例中,我想验证Gender
表的Customer
列以及State
表的Address
列。 validationID
是包含所有有效值(Table2
)的表的外键。
表2 ValidationValues
:此表包含特定验证规则的所有有效值。在示例中,验证规则#1(ValidationID = 1
)有两个有效值,验证规则#2指定了3个有效值。
我想(使用SQL)根据表1中的值动态创建查询,相应地选择Customer.Gender
列和Address.State
列,因此这些列中的值可以是根据表2中的值进行验证。
表1: ColumnsToValidate
TableName | ColumnName | ValidationID
-----------+----------------+-----------------
Customer | Gender | 1
Address | State | 2
表2: ValidationValues
ValidationID | Values
-------------+----------------
1 | Male
1 | Female
2 | NY
2 | WA
2 | CA
表3:客户
CustomerID | Gender
-----------+----------------
111 | Male
112 | Female
113 | Unknown
114 | NULL
表4:地址
AddressID | State
-----------+----------------
211 | AL
212 | NY
213 | WA
214 | NULL
编辑:我可以在C#程序中编写这个,但程序会很慢。我认为纯SQL(SQL Server)可能有一种方法
答案 0 :(得分:0)
这是我的解决方案,分两步进行 -
1)验证值“似乎”目标表和列是已知的,例如以下外部联接查询在 Customer.Gender 列中找到无效值。
select * from Customer a
left join ValidationValues b
on a.Gender = b.values
and a.ValidationID = b.ValidationID
where b.values is null
2)使用dynamic-SQL生成上述SQL脚本,使用表 ColumnsToValidate 中的值,用变量@tab和@col1替换table-name'Customer'和列名'Gender':
declare @tableCursor cursor,
@tab varchar(100),
@col1 varchar(100),
@val_id varchar(20)
set @tableCursor = cursor for select * from ColumnsToValidate
open @tableCursor
fetch next from @tableCursor into @tab, @col1, @val_id
while(@@fetch_status = 0)
begin
--dynamic sql
declare @sql varchar(max)
set @sql =
N'select * from '+ @tab +' a ' +
N'left join ValidationValues b ' +
N'on a.' + @col1 + ' = b.values ' +
N'and a.' + @val_id + ' = b.ValidationID ' +
N'where b.values is null'
--print @sql
exec @sql
fetch next from @tableCursor into @tab, @col1, @val_id
end
close @tableCursor
deallocate @tableCursor
如上所述,这些是模拟代码,并且未经过测试。但是,我只是想与有类似问题的人分享这些想法 - 解决方案的关键是“动态SQL”。