Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用临时表更新多列和多行_Sql_Sql Server_Database_Tsql - Fatal编程技术网

Sql 使用临时表更新多列和多行

Sql 使用临时表更新多列和多行,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 = '

我试图根据条件更新多列值,但它只更新单个列。我不明白为什么它不更新所有列

这是我的SP

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次迭代。谢谢您的帮助。我使用了
      光标
      ,现在它可以工作了。有没有机会将问题标记为已回答?;)