2009-07-29 83 views
2

我想自己学习数据库;所有的意见都表示赞赏。 我有下表。从存储过程更新表格

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时,是否有任何严重错误让您感到畏缩?
+1

很好,你正在尝试学习,但对于像语法错误,你应该首先检查MSDN:http://msdn.microsoft.com/en-us/library/ms177523.aspx。即使BNF符号在你习惯之前可能具有挑战性,也是必须的。随着事情变得更加复杂,你将不得不越来越频繁地使用文档。 – 2009-07-29 03:01:24

+0

thx为鼓励的话。我会为此付出更多的努力。 – MedicineMan 2009-07-29 20:55:27

回答

5

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

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

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列的长度不一致。

+0

恐怕我不明白你在#2和#3中说什么。你介意阐述吗? – MedicineMan 2009-07-29 04:04:43