Обновить Sql db значением NULL, переданным из параметра - PullRequest
0 голосов
/ 15 ноября 2011

Мне нужно сохранить значение с Null, которое передается из параметризованного запроса с использованием VB.net в SSEE 2008 R2.

Значение может быть либо «Null», либо пустой строкой "".Как я могу проверить это и правильно ОБНОВИТЬ поле в моей хранимой процедуре?

РЕДАКТИРОВАТЬ: Добавлены объявления.

@ID int,    
@currTable varchar(150),
@prev_LangString nvarchar(max),
@brief_Descrip nvarchar(max)

BEGIN
 IF @brief_Descrip IS NULL OR @brief_Descrip = 'Null'
 SET @brief_Descrip = 'Null';
END

BEGIN
 SET @sql = 'UPDATE ' + @currTable + ' SET [date_Changed] = ''' +  convert(varchar(20), @submitDate1) + ''', [prev_LangString] = ''' + @prev_LangString + ''',  [brief_Descrip] = ''' + @brief_Descrip + '''
       WHERE (ID = ' + CAST(@ID as nvarchar(10)) + '); '

       EXECUTE(@sql);
END

Спасибо за любую помощь в этом.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Проблема в том, что вы конвертируете @brief_Descript в строку. Это также исправит уязвимость при инъекции.

BEGIN
 IF @brief_Descrip = 'Null'
 SET @brief_Descrip = NULL;
END

UPDATE TABLE table_name
SET
  date_Changed = convert(varchar(20), @submitDate1),
  prev_LangString = @prev_LangString,
  brief_Descrip =  @brief_Descrip,
WHERE
  ID = CAST(@ID as nvarchar(10))

EDIT

Лучший способ исправить это - преобразовать строку null в DBNull в vb.net и использовать параметризованный запрос с оператором обновления. Вы не должны конвертировать дату в строку. Измените тип столбца на дату и время.

0 голосов
/ 15 ноября 2011

Другой вариант - использовать параметризованный запрос. Это даже заставило бы вашу проблему уйти. Как это:

DECLARE @sql NVARCHAR(4000), @params NVARCHAR(4000)
SET @sql = 'UPDATE ' + @currTable + ' SET date_changed = @p0, prev_langstring = @p1, brief_descrip = @p2 WHERE id = @p3'
SET @params = '@p0 VARCHAR(20), @p1 VARCHAR(???), @p2 VARCHAR(???), @p3 NVARCHAR(10)'

DECLARE @sd VARCHAR(20), @sid NVARCHAR(10)
SET @sd = CONVERT(VARCHAR(20), @submiteDate1)
SET @sid = CAST(@ID AS NVARCHAR(10))
EXEC sp_executesql @sql, @params, @p0 = @sd, @p1 = @prev_langstring, @p2 = @brief_descrip, @p3 = @sid

Я не знаю тип данных @prev_langstring и @brief_descrip, следовательно, VARCHAR(???) вы видите выше; замените его настоящим типом данных. Вы можете прочитать о sp_executesql здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...