2009-07-29 9 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記法が挑戦的であっても、必要です。物事がより複雑になるにつれて、ドキュメントにますます多くの時間を費やさなければならなくなります。励ましの言葉のために –

+0

thx私はこれにももっと努力するつもりです。 – MedicineMan

答えて

5

上記のTSQLを読んだときに重大なエラーが表示されるだけですか?

テーブルの文字列フィールドはNVARCHAR(50)のデータ型として設定されていますが、ストアドプロシージャのパラメータはNVARCHAR(20)です。これは懸念の原因となる可能性があります。通常、ストアド・プロシージャのパラメータは、対応するフィールドのデータ型および精度と一致します。

+0

+1いいキャッチ... –

+0

ああ良いキャッチ。私はこれまで考えなかった – MedicineMan

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