![](/img/trans.png)
[英]How to update a table using a subquery that returns multiple rows in SQL Server?
[英]How to update selective rows in a table in sql server?
我正在一个应用程序中,用户通过单击与每行关联的复选框选择gridview中的某些行,并且在选定的行中,只应在数据库中更新一个值。 我正在使用以下查询
update Items
set bitIsTab = 1
where ReqID = 3
假设用户从gridview中选择4个值,并且我必须将这4行bitIsTab设置为1.如何通过调用查询一次来更新这些行,或者我必须调用与所选记录数一样多次的相同查询。
如果你知道你可以做的ReqID
update Items
set bitIsTab = 1
where ReqID in (1,2,3,4)
好的,查询应如下所示,更新项目1,2,3,4:
UPDATE Items
SET bitIsTab = 1
WHERE ReqID IN (1,2,3,4);
但是可以使用Linq
完成:
List<int> selectedIds = { 1, 2, 3, 4 };
var itemsToBeUpdated = (from i in yourContext.Items
where selectedIds.Contains(i.ReqID)
select i);
itemsToBeUpdated.ForEach(i=>i.bitIsTab = 1);
yourContext.SubmitChanges();
或者您可以在存储过程中使用VARCHAR
:
CREATE PROCEDURE sp_setTabItems
@ids varchar(500) AS
UPDATE Items
SET bitIsTab = 1
WHERE charindex(',' + ReqID + ',', ',' + @ids + ',') > 0;
然后使用“1,2,3,4”作为存储过程参数。
要执行存储过程:
EXEC sp_setTabItems '1,2,3,4'
也可以使用bitIsTab
作为参数以更可重用的方式完成:
CREATE PROCEDURE sp_setTabItems
@isTab bit,
@ids varchar(500) AS
UPDATE Items
SET bitIsTab = @isTab
WHERE charindex(',' + ReqID + ',', ',' + @ids + ',') > 0;
并以这种方式执行:
EXEC sp_setTabItems '1,2,3,4',1
我更新了存储过程解决方案,因为将INT
与VARCHAR
进行比较将无法与EXEC
。
一个简单的解决方案
DECLARE @id varchar(30)
SET @id = '1,3,2'
UPDATE [Items]
SET bitIsTab = 0
WHERE ReqID IN (
SELECT s
FROM dbo.Split(',', @id)
)
哪里
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
如果你必须将数据作为分离的ID列表传递,那么你需要编写一个函数来解释如何在单个语句中将CSV数据拆分并插入到新表中?
CREATE PROCEDURE sp_setTabItems
@ids varchar(500) -- 1,2,4,6
AS
UPDATE Items
SET bitIsTab = 1
WHERE ReqID IN (Select Part From dbo.inline_split_me(@ids)
这是功能
CREATE FUNCTION inline_split_me (@SplitOn char(1),@String varchar(7998))
RETURNS TABLE AS
RETURN (WITH SplitSting AS
(SELECT
LEFT(@String,CHARINDEX(@SplitOn,@String)-1) AS Part
,RIGHT(@String,LEN(@String)-CHARINDEX(@SplitOn,@String)) AS Remainder
WHERE @String IS NOT NULL AND CHARINDEX(@SplitOn,@String)>0
UNION ALL
SELECT
LEFT(Remainder,CHARINDEX(@SplitOn,Remainder)-1)
,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(@SplitOn,Remainder))
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)>0
UNION ALL
SELECT
Remainder,null
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)=0
)
SELECT Part FROM SplitSting
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.