多表更新 - 避免多个WHERE子句

时间:2014-01-29 21:54:04

标签: c# sql sql-server

我环顾四周寻找一个类似的问题(我确定在某个地方有一个)但是找不到一个。

我有一个ID列表,对于每个ID,我需要将该ID行的另一列更新为相同的字符串。

基本上,我想要这样的东西:

List<int> uniqueIDs;

UPDATE my_table
SET certainColumn = "foo bar"
WHERE uniqueID = uniqueIDs[0]
    OR uniqueID = uniqueIDs[1]
    ...
    OR uniqueID = uniqueID[uniqueIDs.Length-1]

我知道这可以通过在for / foreach循环中包含它来实现,但我想知道是否有更好的方法来完成这项工作,可能是在一个数据库连接中?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

好吧,你可以使用TVP。首先,在您的服务器上创建它:

CREATE TYPE dbo.UniqueIDs AS TABLE(ID INT PRIMARY KEY);

然后是存储过程:

CREATE PROCEDURE dbo.UpdateByID
  @tvp dbo.UniqueIDs READONLY
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE t SET certainColumn = 'foo bar'
    FROM dbo.my_table AS t
    INNER JOIN @tvp AS tvp
    ON t.uniqueID = tvp.ID;
END

或者:

CREATE PROCEDURE dbo.UpdateByID
  @tvp dbo.UniqueIDs READONLY
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE t SET certainColumn = 'foo bar'
    FROM dbo.my_table AS t
    WHERE EXISTS (SELECT 1 FROM @tvp
      WHERE ID = t.uniqueID);
END

然后使用List代替DataTable在您的C#应用​​程序中保存您的ID,并调用存储过程,将@tvp作为Structured参数传递。我在本网站上发布了简单的C#端示例:

答案 1 :(得分:2)

var query = "UPDATE my_table
SET certainColumn = 'foo bar'
WHERE uniqueID in (" + String.Join(",", uniqueIDs) + ")"

答案 2 :(得分:1)

我想你可以做这样的事情。获取某些TempTable或表变量中的ID列表,并在更新语句中使用IN运算符。像这样......

UPDATE my_table
SET certainColumn = 'foo bar'
WHERE uniqueID IN (SELECT uniqueID 
                   FROM @List_Table)