SQL Server - 使用提供的值验证表列值

时间:2018-04-16 02:30:26

标签: sql sql-server validation

我有以下任务想要使用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)可能有一种方法

1 个答案:

答案 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”。