Mise à jour d'une Table à partir d'une Procédure Stockée
Je suis en train d'apprendre la base de données sur mon propre; tous vos commentaires sont appréciés.
J'ai le tableau suivant.
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
)
Je voudrais écrire une procédure Stockée qui met à jour la ligne. J'imagine que la procédure stockée ressemblerait à quelque chose comme ceci:
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
l'appelant fournit de l'information nouvelle qu'il veut dans la ligne d'en avoir. Je sais que certains champs ne sont pas tout à fait exact et précis; je le fais surtout pour l'apprentissage.
- Je vais avoir une erreur de syntaxe avec les commandes de configuration de la mise à JOUR de la partie, et je ne sais pas comment le résoudre.
- Est la procédure stockée je suis en train d'écrire une procédure que vous écrivez dans la vie réelle? Est-ce un antipattern?
- Y a de graves erreurs que j'ai faites qui vous fait juste grincer des dents quand vous lisez ci-dessus TSQL?
- Est bon que vous essayez d'apprendre, mais pour des choses comme des erreurs de syntaxe, vous devriez d'abord vérifier la MSDN: msdn.microsoft.com/en-us/library/ms177523.aspx. Même si la notation BNF peut être difficile jusqu'à ce que vous vous habituez à elle, est un must. Comme les choses vont devenir plus compliqué, vous devrez recourir à la documentation de plus en plus souvent.
- thx pour le mot d'encouragement. Je vais mettre plus d'effort pour cela.
Vous devez vous connecter pour publier un commentaire.
Pas vraiment "grave", mais j'ai remarqué de votre table, les champs de type chaîne sont mis en place comme le type de données NVARCHAR(50) encore vos paramètres de procédure stockée sont de type NVARCHAR(20). Cela peut être une cause de préoccupation. Généralement vos paramètres de procédure stockée correspond à la du champ type de données et de la précision.
#1: Vous avez besoin des virgules entre vos colonnes:
SET
n'est appelée qu'une fois, au tout début de laUPDATE
liste. Chaque colonne après c'est dans une liste séparée par des virgules. Découvrez la MSDN docs sur elle.#2: Ce n'est pas un antipattern, en soi. Surtout compte tenu de la saisie de l'utilisateur. Vous souhaitez parametized requêtes, afin d'éviter les L'injection SQL. Si vous avez été de construire la requête comme une chaîne hors tension de l'entrée d'utilisateur, vous seriez très, très sensibles à l'injection SQL. Cependant, en utilisant des paramètres, vous contourner cette vulnérabilité. La plupart du SGBDR assurez-vous de désinfecter les paramètres passés à ses requêtes automatiquement. Il y a beaucoup d'adversaires de procédures stockées, mais vous êtes en l'utilisant comme un moyen de battre l'injection SQL, il n'est donc pas un antipattern.
#3: La seule erreur grave que j'ai vu était le
SET
, au lieu de virgules. Aussi, comme ckittel souligné, votre incohérence dans la longueur de votrenvarchar
colonnes.