2012-07-20 166 views
0

好,我有如下表稱爲Foo這是一個複雜PIVOT查詢SQL動態WHERE子句

Example Result Set

我需要刪除該表具有行(DB1,DB2,DB3的輸出)全部NULL。要做到這一點,我們通常可以使用類似

DELETE FROM Foo 
WHERE [DB1] IS NULL 
    AND [DB2] IS NULL 
    AND [DB3] IS NULL; 

但問題是,這個代碼是從C#和列(DB1,DB2,DB3)呼籲將執行到執行改變。

我該如何動態地做到這一點?

謝謝你的時間。

Edit1。我有另一個表Bar,其中包含可用的DB#列,因此可以使用此表SELECT DISTINCT ...獲取我在WHERE子句中需要的列的列表。但是,我從來沒有這樣做過,不知道從哪裏開始...任何幫助表示讚賞。

Edit2。我無法以任何方式使用C#。 C#代碼是SQL的解析器,可以與給定的.sql文件一起使用。這必須完全在SQL中完成。

回答

1

sp_executesql允許您執行SQL腳本中構建的SQL字符串。

http://msdn.microsoft.com/en-us/library/ms188001.aspx

從你的表吧

create proc DumpFooJunk 
as 
begin 
    declare @strCols nvarchar(max) 
    select @strCols = N'' 
    select @strCols = @strCols + ' AND ' + name + ' IS NULL ' from [bar] 
    select @strCols = N'DELETE FROM [foo] WHERE ' + substring(@strCols,5,LEN(@strcols)) 
    select @strCols 
    -- exec sp_executesql @strCols 
end 
+0

謝謝你。它給了我一些想法,但這裏仍然存在名稱問題。如何得到它?你的子串從5開始,爲什麼?名稱的長度(即DB1等)是可變長度的。謝謝你的時間。 – MoonKnight 2012-07-20 15:25:26

+0

該字符串從5開始,因爲它在開始時由一個額外的'AND'構建。如果你想要的話,你可以把這段代碼放到一個存儲過程中,並按照這種方式調用 - 參見編輯。或者你的意思是如何到達sql?只需取消註釋sp_execute sql行。 – podiluska 2012-07-20 15:31:52

+0

它將在SP中。但問題仍然存在,即使您提供了什麼 - 我如何獲取所需的列名。請參閱Edit1。再次感謝您的時間。 – MoonKnight 2012-07-20 15:33:39

1

您可以使用StringBuilder動態構建WHERE子句,假定C#代碼知道應該出現在輸出中的列。

通常,當您這樣做時,您希望在動態WHERE子句中包含參數佔位符,並動態地將參數添加到查詢中以避免SQL注入。但是,在這種情況下,沒有變量值。只需在C#中動態連接WHERE子句的各個部分即可。

+0

由於各種原因,我無法使用C#來幫助我。 C#代碼是SQL的解析器,可以即時執行SQL腳本文件。這必須在SQL腳本文件中完成。謝謝你的時間。 – MoonKnight 2012-07-20 15:06:50

0

試圖通過他們的指數值以獲得列,如果他們總是在相同的位置,並得到了列標題名稱,然後使用構造SQL語句他們。

例如

string colHeader1 = (string)dr[3]; 
string colHeader2 = (string)dr[4]; 
string colHeader3 = (string)dr[5]; 
+0

我無法使用C#。請參閱我上面提出的評論。非常感謝...... – MoonKnight 2012-07-20 15:29:16

1

除了動態構建WHERE,你也可以嘗試這樣的事:

DELETE FROM Foo 
WHERE 
    (0 = @db1 AND [DB1] IS NULL) 
    AND (0 = @db2 AND [DB2] IS NULL) 
    AND (0 = @db3 AND [DB3] IS NULL) 
    -- Etc... 
; 

通過設置綁定參數@db_爲0,則可以有效地「關閉」相應IS NULL。因此,只需將那些需要測試的值設置爲不同於0的值。

+0

謝謝,但在這個階段,我不能假定名稱(DB1,DB2等)會一致(它們可能是任何東西),並且可能有任何數量的名稱。就像我在編輯中所說的,我可以從另一個表'Bar'中獲得這些名稱,我可以在其中選擇'DISTINCT ...',但是我仍然對如何構建需要的WHERE子句感到迷茫。感謝您的時間... – MoonKnight 2012-07-20 15:28:28

+0

@Killercam你是說你實際存儲字段_names_在其他表?如果是的話,你有更大的問題;)如果不是,只需列出這個'WHERE'中的所有可能的字段。 – 2012-07-20 16:02:46

+0

我已經接受了上面的答案。事實上,我從另一張桌子上得到它,我不知道如何做到這一點,@podiluska 想出了一個奇妙的解決方案!感謝你的寶貴時間... – MoonKnight 2012-07-20 16:12:20