从存储过程更新表

时间:2009-07-29 02:15:00

标签: sql sql-server tsql

我正在尝试自己学习数据库;所有评论都表示赞赏。 我有下表。

CREATE TABLE AccountTable
(
    AccountId INT IDENTITY(100,1) PRIMARY KEY,
    FirstName NVARCHAR(50) NULL,
    LastName NVARCHAR(50) NULL,
    Street NVARCHAR(50) NULL,
    StateId INT REFERENCES STATETABLE(StateId) NOT NULL
)

我想编写一个更新行的存储过程。我想存储过程看起来像这样:

CREATE PROCEDURE AccountTable_Update
       @Id          INT,
       @FirstName  NVARCHAR(20),      
  @LastName   NVARCHAR(20), 
  @StreetName NVARCHAR(20),
  @StateId  INT
  AS
BEGIN
UPDATE AccountTable 
  Set FirstName = @FirstName
  Set LastName = @LastName
  Set Street = @StreetName
  Set StateId = @StateId 
  WHERE AccountId = @Id
END

调用者提供他希望该行拥有的新信息。我知道有些领域并不完全准确或准确;我这样做主要是为了学习。

  1. UPDATE部分中的SET命令出现语法错误,我不知道如何修复它。
  2. 存储过程是否正在编写一个您将在现实生活中编写的过程?这是反模式吗?
  3. 当您阅读上述TSQL时,我是否有任何严重错误让您感到畏缩?

2 个答案:

答案 0 :(得分:5)

  

当您阅读上述TSQL时,是否有任何严重错误让您感到畏缩?

不是真的“严重”,但我注意到你的表的字符串字段被设置为NVARCHAR(50)的数据类型,但你的存储过程参数是NVARCHAR(20)。这可能引起关注。通常,存储过程参数将匹配相应字段的数据类型和精度。

答案 1 :(得分:4)

#1:您的列之间需要逗号:

UPDATE AccountTable SET
    FirstName = @FirstName,
    LastName = @LastName,
    Street = @StreetName,
    StateId = @StateId
WHERE 
    AccountId = @Id

SET仅在UPDATE列表的开头调用一次。之后的每一列都以逗号分隔的列表。查看上面的MSDN docs

#2:这本身并不是反模式。特别是给用户输入。您需要参数化查询,以避免SQL injection。如果您要将查询构建为用户输入的字符串,那么您将非常非常容易受到SQL注入的影响。但是,通过使用参数,您可以绕过此漏洞。大多数RDBMS确保自动清理传递给其查询的参数。存储过程有很多反对者,但是你使用它作为击败SQL注入的方法,所以它不是反模式。

#3:我看到的唯一严重错误是SET而不是逗号。此外,正如ckittel指出的那样,您nvarchar列的长度不一致。

相关问题