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

您可以使用 StringBuilder 动态构建 WHERE 子句,假设 C# 代码知道输出中应该存在的列。

通常,当您这样做时,您会希望在动态 WHERE 子句中包含参数占位符,并动态地将参数添加到查询中以避免 SQL 注入。但是,在这种情况下,没有变量值。只需在 C# 中动态连接 WHERE 子句的各个部分。

于 2012-07-20T15:03:08.567 回答
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
于 2012-07-20T15:11:36.137 回答
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 回答
0

如果它们始终位于相同的位置,请尝试通过它们的索引值获取列,并获取列标题名称,然后使用它们构造 SQL 语句。

例如

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