我的SQL家伙已经离开了几天,我知道这很危险。我在excel文件中有大约350行,但当然没有一个单元格是我想要更新的表的主键。
我可以编写一个select语句并加入必要的表/字段以获取我需要的主键。我有一个存储过程来进行我想要的更新。
我如何遍历~350条记录并每次调用该SP。
SP非常简单,如下所示:
UPDATE
tblAssessments
SET
StatusCode = @statusCode
WHERE
AssessmentID = @assessmentID
AssessmentID是我要更新的表格上的PK。它恰好是一个GUID。 excel文件有一个字符串,其中包含名为FacilityID的单元格,其格式为12345-123。它也很独特。通过一些连接,我可以获得350行来将FacilityID链接到AssessmentID。
我猜测我将excel文件导入TEMP表,然后进行连接以将FacilityID(字符串)链接到AssessmentID(guid)。但如果有更好的方法,请接受任何想法。
谢谢!
编辑:
我现在有一个包含3列的表格如下所示。第一列是我的Excel数据中间列是我在我的数据库中的一个表上链接的最后一列是我想要更新其他字段的数据库表。
FinSub FacilityID AssessmentID
563140-002 563140-002 4CD11CE1-7B8B-403C-B9B8-1D2A02A1B5B2
033737-001 033737-001 4FC73CD1-DAF2-405D-99F1-58F6A8262930
034490-001 034490-001 8641EF38-65F4-4496-A5E1-C998C5293D8D
036956-002 036956-002 31C5DEC7-09BE-426B-BADE-CA5D35AB3C1A
运行Joe C的代码时出现错误消息:
Msg 512,Level 16,State 1,Procedure trg_tblAssessments_UpdateFacilityInfo,Line 6 子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。 声明已经终止。
编辑: 如果我运行更新的代码,我会得到同样的错误。如果我在临时表的第一列或第三列上运行DISTINCT,我得到344,这是行数。我看了一下触发器,它对整个数据库或APP支持来说并不重要。禁用触发器的任何伤害然后在完成时启用?
答案 0 :(得分:1)
您应该使用带连接的更新。一旦在临时表或子查询中附加了ID,就可以使用一个语句更新所有行,并消除对SP的需要。
如果您真的想使用SP方法,可以使用游标循环遍历350行表。
https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/
编辑: 由于你有临时表,这应该有效:
UPDATE T
SET
T.StatusCode = 9
From tblAssessments T
Join (Select Distinct AssessmentID From TempTable) T2
On T2.AssessmentID = T.AssessmentID
通常@statusCode将是连接表(T2)上的一个字段,但是如果你想在所有匹配上加上相同的值,你只需要在运行更新之前声明并填充变量。