【问题标题】:updating table information using stored procedure使用存储过程更新表信息
【发布时间】:2012-12-18 14:01:44
【问题描述】:

我有一个数据库,其中包含资产列表及其从表“tbl_info”中提取的信息,解决方案在 sql 中签出,但在提交后它不会更新表。我不知道我错在哪里。我对存储过程和 sql 相当陌生。

这是我的代码。

CREATE PROCEDURE [update_TBL_INFO_4]
(@ASSET_NUMBER  [nvarchar],
 @PORT_NUMBER   [nvarchar],
 @MACHINE_NAME  [nvarchar],
 @TYPE  [nvarchar],
 @BRANCH    [nvarchar],
 @BUILDING_NUMBER   [nvarchar],
 @FLOOR     [nvarchar],
 @ROOM_NUMBER   [nvarchar],
 @TELEPHONE_NUMBER  [nvarchar],
 @USERS     [nvarchar],
 @SERIAL    [nvarchar])

AS 
BEGIN
UPDATE [datasystems].[dbo].[TBL_INFO] 

SET  [ASSET_NUMBER]  = @ASSET_NUMBER,
 [PORT_NUMBER]   = @PORT_NUMBER,
 [MACHINE_NAME]  = @MACHINE_NAME,
 [TYPE]  = @TYPE,
 [BRANCH]    = @BRANCH,
 [BUILDING_NUMBER]   = @BUILDING_NUMBER,
 [FLOOR]     = @FLOOR,
 [ROOM_NUMBER]   = @ROOM_NUMBER,
 [TELEPHONE_NUMBER]  = @TELEPHONE_NUMBER,
 [USERS]     = @USERS,
 [SERIAL]    = @SERIAL 

WHERE 
( [ASSET_NUMBER]     = @ASSET_NUMBER AND
 [PORT_NUMBER]   = @PORT_NUMBER AND
 [MACHINE_NAME]  = @MACHINE_NAME AND
 [TYPE]  = @TYPE AND
 [BRANCH]    = @BRANCH AND
 [BUILDING_NUMBER]   = @BUILDING_NUMBER AND
 [FLOOR]     = @FLOOR AND
 [ROOM_NUMBER]   = @ROOM_NUMBER AND
 [TELEPHONE_NUMBER]  = @TELEPHONE_NUMBER AND
 [USERS]     = @USERS AND
 [SERIAL]    = @SERIAL)
END
GO

【问题讨论】:

  • 你的WHERE 子句没有任何意义;每次更新记录的唯一方法是传入的数据与表中的数据相同,最终结果将是没有任何变化。表的主键是什么?
  • 为什么这个 Q 的所有反对票都投了?
  • 所有这些@PORT_NUMBER [nvarchar], 参数都很好,并且正好1 个字符 长...当使用(N)VARCHAR 时,您应该始终指定一个参数的显式长度

标签: asp.net sql-server visual-studio stored-procedures


【解决方案1】:

由于您的 WHERE 子句检查了 所有 参数,如果它们中的任何一个不同(即,当您传入更新的值时),WHERE 不会执行查找任何匹配的记录。

如果您定义了主键,请在 WHERE 子句中使用它并更新其余部分。否则,您可能还需要传入旧值才能找到合适的匹配项。

更新:

由于主键为ASSET_NUMBER,您需要更新不是主键的字段,并在WHERE 子句中单独使用主键,如下所示:

UPDATE 
    [datasystems].[dbo].[TBL_INFO] 
SET  
    [PORT_NUMBER] = @PORT_NUMBER,
    [MACHINE_NAME] = @MACHINE_NAME,
    [TYPE] = @TYPE,
    [BRANCH] = @BRANCH,
    [BUILDING_NUMBER] = @BUILDING_NUMBER,
    [FLOOR] = @FLOOR,
    [ROOM_NUMBER] = @ROOM_NUMBER,
    [TELEPHONE_NUMBER] = @TELEPHONE_NUMBER,
    [USERS] = @USERS,
    [SERIAL] = @SERIAL 
WHERE 
    [ASSET_NUMBER] = @ASSET_NUMBER

【讨论】:

  • 主键是asset_number
  • @user1913068 - 然后将您的 WHERE 子句更改为 WHERE ( [ASSET_NUMBER] = @ASSET_NUMBER )。不要试图粗鲁,但对于“精通 SQL”的人来说,你可能想复习一下你的 SQL,这是非常基本的。
  • 很好,我期待批评,因为我被扔到这个位置,并在一个月的时间内给了一本关于这些东西的书,我在 1 周内就有了一个工作网站,有能力拉信息等,我以前从未这样做过,所以我非常感谢您的帮助。
  • 根据其他人对该问题的评论,您是否已将您的定义从 NVARCHAR 更新为更长的内容,例如 NVARCHAR(255)?当 NVARCHAR 在定义中未指定长度的情况下使用时,它默认为 1 个字符 - 因此如果值包含多个字符,则需要使用长度声明参数才能在 @ 中获得匹配987654333@ 子句 (msdn.microsoft.com/en-us/library/ms186939.aspx)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多