从存储过程更新表格
我想自己学习数据库;所有的意见都表示赞赏。 我有下表。从存储过程更新表格
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
呼叫者提供他想要的行,从而具有新的信息。我知道一些领域并不完全准确或不准确;我这样做主要是为了学习。
- 我在UPDATE部分有一个语法错误的SET命令,我不知道如何解决它。
- 存储过程我正在写一个过程,你会写在现实生活中吗?这是一个反模式?
- 当您阅读上述TSQL时,是否有任何严重错误让您感到畏缩?
当你阅读上述TSQL时,是否有任何严重错误让你畏缩?
不是“严重”,但我注意到您的表的字符串字段被设置为NVARCHAR(50)的数据类型,但您的存储过程参数是NVARCHAR(20)。这可能引起关注。通常你的存储过程参数将匹配相应的字段的数据类型和精度。
#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
列的长度不一致。
恐怕我不明白你在#2和#3中说什么。你介意阐述吗? – MedicineMan 2009-07-29 04:04:43
很好,你正在尝试学习,但对于像语法错误,你应该首先检查MSDN:http://msdn.microsoft.com/en-us/library/ms177523.aspx。即使BNF符号在你习惯之前可能具有挑战性,也是必须的。随着事情变得更加复杂,你将不得不越来越频繁地使用文档。 – 2009-07-29 03:01:24
thx为鼓励的话。我会为此付出更多的努力。 – MedicineMan 2009-07-29 20:55:27