[英]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.