【问题标题】:SQL Update into table with caseSQL 更新到带有大小写的表中
【发布时间】:2023-03-24 16:25:01
【问题描述】:

我对 DB 的东西还是陌生的,这给我带来了一个问题。

我正在规范化我的表,并创建了一个新表,其中 [Status] 现在是 FK。

我能够将原始表中的所有值插入新表中,减去 [Status]

我现在尝试使用选择案例插入 [Status]。

尝试1:

USE [GESS]
GO

DECLARE @int_status int;
SELECT @int_status = 
    (CASE 
        WHEN [Status] = 'Alumni' THEN 5
        WHEN [Status] = 'Faculty' THEN 6
        WHEN [Status] = 'Friend' THEN 7
        WHEN [Status] = 'Student' THEN 8
        ELSE 9
    END)
FROM [dbo].[GESSContact]

INSERT INTO dbo.GESSContact2 ([Status]) VALUES (@int_status)
GO

但它说只有 1 行受到影响。

尝试2:

USE [GESS]
GO

INSERT INTO [dbo].[GESSContact2]([Status])
    Select (
    CASE 
        WHEN o.[Status] = 'Alumni' THEN 5
        WHEN o.[Status] = 'Faculty' THEN 6
        WHEN o.[Status] = 'Friend' THEN 7
        WHEN o.[Status] = 'Student' THEN 8
        ELSE 9
    END) As [Status]
From [dbo].[GESSContact] o
GO

这表示所有行都受到影响,但当我检查时 [Status] 仍然设置为 null。

感谢任何帮助/建议

更新:

当人们帮助我时,我标记为答案的回复让我意识到我需要做一个 UPDATE 而不是 INSERT。这是我用来完成这项工作的 SQL。

USE [GESS]
GO

UPDATE [dbo].[GESSContact2]
SET [dbo].[GESSContact2].[Status] = 
    CASE  
        WHEN o.[Status] = 'Alumni' THEN 5
        WHEN o.[Status] = 'Faculty' THEN 6
        WHEN o.[Status] = 'Friend' THEN 7
        WHEN o.[Status] = 'Student' THEN 8
        ELSE 9
    END 
FROM [dbo].[GESSContact2] JOIN [dbo].[GESSContact] o
ON [dbo].[GESSContact2].id = o.id

感谢所有帮助过的人!

【问题讨论】:

  • 在表 dbo.GESSContact2 ([Status]) 中有多少列?我可以得到表定义吗?你在状态表中是否有像 5,6,7,8,9 这样的数据,因为它被用作 dbo.GESSContact2 表的外键?
  • 我将表格 def 添加到原始帖子中。在状态表中,(5,6,7,8,9) 是主键。在原始表中,它们是字符串值
  • 我需要这个表 [dbo].[GESSContact2] 定义。我只需要列数和列名
  • 共有50列,命名为[id],[FirstName],[MiddleInitial],[LastName],[MaidenName],[Suffix],[Title],[FullName],[SpouseName], [雇主],[顾问],[状态],[捐助者],[Degree1],[Degree2],[Degree3],[Graduation1],[Graduation2],[Graduation3],[Major],[Minor],[Specialty ],[Address],[AddressSecond],[City],[State],[Zipcode],[Country],[Email],[Phone],[Address2],[Address2Second],[City2],[State2], [Zipcode2],[Country2],[Email2],[Phone2],[Address3],[Address3Second],[City3],[State3],[Zipcode3],[Country3],[Email3],[Phone3],[Confirmed ],[EmailOnly],[通讯],[已故]

标签: sql sql-server select insert case


【解决方案1】:

我想我发现了问题。您的id 不为空,因此您必须为id 列提供增量值,否则您必须使id 列auto increment

转到 sql server 管理工作室。右键单击表格然后进入设计模式并从属性区域中选择身份为真。

如果您需要一些帮助来添加身份,请按照以下方式操作: Auto increment primary key in SQL Server Management Studio 2012

并使用以下查询插入:

INSERT INTO [dbo].[GESSContact2]([Status])
Select 
    CASE 
        WHEN o.[Status] = 'Alumni' THEN 5
        WHEN o.[Status] = 'Faculty' THEN 6
        WHEN o.[Status] = 'Friend' THEN 7
        WHEN o.[Status] = 'Student' THEN 8
        ELSE 9
    END 
From [dbo].[GESSContact] o

【讨论】:

  • 这篇文章让我意识到我做错了。在我的 OP 中,我说我已经将原始表中的所有列添加到这个新表中。我需要更新,而不是插入...(掌心)
【解决方案2】:

这应该可以工作

INSERT INTO [dbo].[GESSContact2]([Status])
Select 
    CASE 
        WHEN o.[Status] = 'Alumni' THEN 5
        WHEN o.[Status] = 'Faculty' THEN 6
        WHEN o.[Status] = 'Friend' THEN 7
        WHEN o.[Status] = 'Student' THEN 8
        ELSE 9
    END 
From [dbo].[GESSContact] o

【讨论】:

  • 与之前的结果相同。它表示行已更新,但 [Status] 仍然为空
  • 你试过在普通的数据库控制台而不是触发器中使用这个查询吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多