0

すべて、複雑なクエリFooの出力である次のテーブルが呼び出されますPIVOT

結果セットの例

(DB1, DB2, DB3) all を持つこのテーブルの行を削除する必要がありますNULL。これを通常に行うには、次のようなものを使用できます

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

しかし問題は、このコードが C# から呼び出され、列 (DB1、DB2、DB3) が実行ごとに変わることです。

これを動的に行うにはどうすればよいですか?

御時間ありがとうございます。

編集1. Bar使用可能な列を含む別のテーブルがDB#あるので、このテーブルを使用して、句SELECT DISTINCT ...で必要な列のリストを取得できます。WHEREただし、これまでにこれを行ったことがなく、どこから始めればよいかわかりません...どんな助けも大歓迎です。

編集2。私は C# をまったく使用できません。C# コードは SQL のパーサーであり、指定された .sql ファイルで動作します。これは完全に SQL で行う必要があります。

4

4 に答える 4

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 以外の値に設定するだけです。

于 2012-07-20T15:22:18.660 に答える
1

C# コードが出力に存在する必要がある列を認識していると仮定すると、StringBuilder を使用して WHERE 句を動的に構築できます。

通常、これを行う場合は、動的 WHERE 句にパラメーター プレースホルダーを含め、SQL インジェクションを回避するためにパラメーターをクエリに動的に追加することをお勧めします。ただし、この場合、変数値はありません。C# で WHERE 句の一部を動的に連結するだけです。

于 2012-07-20T15:03:08.567 に答える
1

sp_executesqlSQL スクリプトで構築された 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
于 2012-07-20T15:11:36.137 に答える
0

列が常に同じ位置にある場合は、インデックス値で列を取得し、列ヘッダー名を取得してから、それらを使用して SQL ステートメントを作成してください。

例えば

string colHeader1 = (string)dr[3];
string colHeader2 = (string)dr[4];
string colHeader3 = (string)dr[5];
于 2012-07-20T15:22:07.197 に答える