2009-07-29 3 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. У меня есть синтаксическая ошибка с командами SET в части UPDATE, и я не знаю, как ее исправить.
  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-инъекции. Однако, используя параметры, вы обошли эту уязвимость. Большинство РСУБД должны автоматически дезактивировать параметры, переданные в его запросах. Существует множество противников хранимых процедур, но вы используете его как способ превзойти SQL-инъекцию, поэтому это не антипаттерн.

# 3: Единственной серьезной ошибкой, которую я видел, была SET вместо запятых. Кроме того, как отметил ckittel, ваша несогласованность в длине ваших столбцов nvarchar.

+0

Боюсь, я не понимаю, что вы говорите в # 2 и № 3. Не могли бы вы разобраться? – MedicineMan

Смежные вопросы