繁体   English   中英

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

[英]SQL Server - validate table column values against with values provided

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

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

示例如下:

Table1 ColumnsToValidate指定需要在其中验证值的表/列。 在示例中,我要验证“ Customer表的“ Gender列和“ Address表的“ State列。 validationID是指向包含所有有效值的表( Table2 )的外键。

Table2 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: 验证值

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)为了验证值“好像”知道目标表和列,例如,以下外部联接查询在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替换表名'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”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM