2009-07-29 60 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