2014-07-25 112 views
1

最近,大約2個月前,需要檢查表中具有NULL值的任何字段。檢查表中是否有任何字段有空值

我現在進入另一個任務,但這次我需要檢查表中的任何字段是否有空字符串值。

開始查詢:

;With xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns) 
SELECT * 
FROM [Schema].[Table] act 
where (
    select act.* 
    for xml path('row'), elements xsinil, type 
).exist('//*/@ns:nil') = 1 

我知道自己需要改變@ns:nil但正如我在T-SQL的XQuery實現是沒有受過教育,我需要有人來幫助我這個初始查詢。另外,我應該去MSDN以外的地方閱讀使用和功能。

更新#1:

;With xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns) 
Select * 
from Schema.Table act 
where (
    select act.* 
    for xml path('row'), elements xsinil, type 
).value('(//row/*)[1]', 'varchar(max)') = '' 

試過,但明顯的領域之一包含字符0x001C等都需要轉換爲二進制,varbinary或圖像,然後使用BINARY BASE64指令。

回答

1

構建XML並檢查是否爲空的節點值。比檢查null更簡單,並且如註釋中所述,只有(n)varchar產生一個空字符串作爲節點值。

select * 
from T 
where (
     select T.* 
     for xml path(''), type 
    ).exist('*/text()[. = ""]') = 1 
+0

我需要搜索的列是VarChar字段。事實上XQuery會更快,因爲有些表只有7個字段,而其他的字段有50多個字段。因此,我需要「相對」輕鬆地遍歷各個表,然後找出哪些表中有空值,因此我知道將哪些轉換爲NULL。 – GoldBishop

+0

你的意思是表中的每一列都是一個varchar列,或者你只想檢查一下varchar列嗎?我不認爲XQuery版本更快。更快輸入yes。執行速度並不快。也許你應該看看動態地創建where子句,以便你的代碼可以重複使用多個表? –

+0

最好只檢查varchar字段。但是,如果值類型不符合字符串,將不會空()返回NULL而不是0或1。 – GoldBishop

相關問題