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

Nat*_*son 0 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]
Run Code Online (Sandbox Code Playgroud)

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

任何帮助是极大的赞赏.

Aar*_*and 5

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

CREATE TYPE dbo.UniqueIDs AS TABLE(ID INT PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)

然后是一个存储过程:

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
Run Code Online (Sandbox Code Playgroud)

要么:

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
Run Code Online (Sandbox Code Playgroud)

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