[英]Compare the values within the same column against other columns in 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.