Sql 使用临时表更新多列和多行
我试图根据条件更新多列值,但它只更新单个列。我不明白为什么它不更新所有列 这是我的SPSql 使用临时表更新多列和多行,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我试图根据条件更新多列值,但它只更新单个列。我不明白为什么它不更新所有列 这是我的SP CREATE PROCEDURE [dbo].[MIC_UpdateIdeaInline] ( @UpdatedBy int, @UpdatedOn Datetime, @UpdateRecords [UpdateIdeaInline] READONLY ) as BEGIN UPDATE MI SET MI.IsPortalShare= CASE WHEN ColoumnName = '
CREATE PROCEDURE [dbo].[MIC_UpdateIdeaInline]
(
@UpdatedBy int,
@UpdatedOn Datetime,
@UpdateRecords [UpdateIdeaInline] READONLY
)
as
BEGIN
UPDATE MI
SET MI.IsPortalShare= CASE WHEN ColoumnName = 'IsPortalShare' THEN CAST(ur.ColValue as BIT) ELSE IsPortalShare END
,MI.Validity= CASE WHEN ColoumnName = 'Validity' THEN CAST(ur.ColValue as BIT) ELSE Validity END
,MI.DeadLine= CASE WHEN ColoumnName = 'DeadLine' THEN CAST(ur.ColValue as datetime) ELSE DeadLine END
,MI.UpdatedBy=@UpdatedBy, MI.UpdatedOn=@UpdatedOn
from [MIC_Idea] MI
Join @UpdateRecords ur ON MI.Id=ur.IdeaId
SELECT 1
END
这些是调用SP时的参数
declare @p3 dbo.UpdateIdeaInline
insert into @p3 values(N'15',N'Validity',N'1')
insert into @p3 values(N'15',N'DeadLine',N'15-Jun-2017')
insert into @p3 values(N'14',N'Validity',N'0')
insert into @p3 values(N'14',N'DeadLine',N'15-Jun-2017')
exec MIC_UpdateIdeaInline @UpdatedBy=1,@UpdatedOn='2017-06-06 21:45:19.863',@UpdateRecords=@p3
go
UpdateIdeaInline是表类型。它的第一列包含
- 身份证
- 列名
- 列值 正如您所看到的,我想为相同的ID14和ID15更新列(有效期和截止日期)。但它只是在更新有效性列
- 这是因为您的更新是在单个原子事务中进行的。Update语句更新表两次,因为UpdateRecords表中的ID重复。因此,在第二次更新时,它无法读取由第一次更新更新的值
例如:
您的值为10和15
现在,您将发布一个与UpdateRecord表连接的更新,该表有两个相同的ID,但每个ID对应不同的列
例如,UpdateRecord具有
“Col1”,30
“Col2”,40
首次更新后:
10-->30(待定)
15-->15(待定)
第二次更新后:
10-->10(待定)
15-->40(待定)
提交事务后:
10-->10
15-->40您的表type@UpdateRecords中ID 14和15的列名称和列值是什么?columnName可能不是“deadline”。@Coder1991:我正在传递要在MIC_Idea表格中更新的columnName和columnValue。在您在问题中发布的脚本中,您在检查“case when columnName=”deadline“”时使用了一个case。IDS14和IDS15的“截止日期”值可用吗?@Coder1991:是。你可以从我的exec SP参数中看到,明白了。但有没有其他方法可以更新多个列呢?您应该转置UpdateRecord表,这样每个唯一ID都有所有列(请参阅PIVOT/UNPIVOT),或者您应该发出多个更新语句,每列一个。这些多个更新语句可以组织在WHILE循环中,因此它将是一个更新,但执行多次。也就是说,你应该遍历每一列。如果您有10列,那么无论UpdateRecord表中的行数如何,WHILE循环都将有10次迭代。谢谢您的帮助。我使用了
光标
,现在它可以工作了。有没有机会将问题标记为已回答?;)