我环顾四周寻找一个类似的问题(我确定在某个地方有一个)但是找不到一个。
我有一个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循环中包含它来实现,但我想知道是否有更好的方法来完成这项工作,可能是在一个数据库连接中?
非常感谢任何帮助。
答案 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)