SQL Server-根据提供的值验证表列值

SQL Server-根据提供的值验证表列值,sql,sql-server,validation,Sql,Sql Server,Validation,我有以下任务需要使用SQL Server的查询和/或存储过程来解决,如果有人能给我一些指导,我将不胜感激 基本上,我们有一个基于SQL Server的数据仓库。我想验证某些表中的列,以确保这些列中的值有效 示例如下: 表1ColumnsToValidate指定需要在其中验证值的表/列。在本例中,我想验证Customer表的Gender列,以及Address表的State列。而validationID是保存所有有效值的表的外键(Table2) 表2ValidationValues:此表包含特定验证

我有以下任务需要使用SQL Server的查询和/或存储过程来解决,如果有人能给我一些指导,我将不胜感激

基本上,我们有一个基于SQL Server的数据仓库。我想验证某些表中的列,以确保这些列中的值有效

示例如下:

表1
ColumnsToValidate
指定需要在其中验证值的表/列。在本例中,我想验证
Customer
表的
Gender
列,以及
Address
表的
State
列。而
validationID
是保存所有有效值的表的外键(
Table2

表2
ValidationValues
:此表包含特定验证规则的所有有效值。在本例中,验证规则#1(
ValidationID=1
)有两个有效值,验证规则#2指定了3个有效值

我想(使用SQL)根据表1中的值动态创建一个查询,从而选择
Customer.Gender
列和
Address.State
列,这样就可以根据表2中的值验证这些列中的值

表1:列验证

TableName  |   ColumnName   |  ValidationID
-----------+----------------+-----------------
Customer   |    Gender      |   1       
Address    |    State       |   2       
ValidationID | Values  
-------------+----------------
1            | Male      
1            | Female       
2            | NY      
2            | WA        
2            | CA      
CustomerID | Gender  
-----------+----------------
111        | Male      
112        | Female       
113        | Unknown      
114        | NULL    
表2:验证值

TableName  |   ColumnName   |  ValidationID
-----------+----------------+-----------------
Customer   |    Gender      |   1       
Address    |    State       |   2       
ValidationID | Values  
-------------+----------------
1            | Male      
1            | Female       
2            | NY      
2            | WA        
2            | CA      
CustomerID | Gender  
-----------+----------------
111        | Male      
112        | Female       
113        | Unknown      
114        | NULL    
表3:客户

TableName  |   ColumnName   |  ValidationID
-----------+----------------+-----------------
Customer   |    Gender      |   1       
Address    |    State       |   2       
ValidationID | Values  
-------------+----------------
1            | Male      
1            | Female       
2            | NY      
2            | WA        
2            | CA      
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) 要验证值,“就好像”目标表和列是已知的,例如,下面的外部联接查询在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) 使用动态SQL生成上述SQL脚本,使用表ColumnsToValidate中的值,用变量@tab和@col1替换表名“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”。

只希望star@maSTAShuFu太难了?这是一个好的开始:。然后,一旦你记下了这个,就转到这个:@MichaelC如果你让我们想象一下,它会花很多时间。。。因此,现在只希望您想要做的事情会出现在您的OP中。一个选项:您可以创建一个表,在验证表之后可以在其中插入验证详细信息,并使用存储过程来验证它,方法是将它安排在SQL Server代理中进行验证的作业中。