簡體   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