запрос на обновление искажает символы - PullRequest
0 голосов
/ 27 мая 2019

мое обновление sql работает корректно, но меняет турецкие символы. Обновить запрос изменяет турецкие символы, такие как ı на i и т. д. Вот мой запрос:

set @updstatement = 'UPDATE ' + @table_name + ' SET ' + @text_col + '= ''' + @newText + ''' WHERE ' + @id_col + '= ''' + @cur_Id + '''';
                PRINT @updstatement
                exec sp_executesql @updstatement 
                PRINT 'Updated: ' + @cur_Id;

Я пробовал варианты COLLATE DATABASE_DEFAULT и COLLATE TURKISH_CI_AS, но ничего не изменилось. Тип данных столбца - ntext. Разбор параметров базы данных таблицы: Latin1_General_CI_AS. Настройка сортировки таблицы: Latin1_General_CI_AS. Параметр сортировки столбца Latin1_General_CI_AS. Перед обновлением я вижу, что турецкие символы правильно хранятся в столбце таблицы. После обновления запроса данные столбца повреждены. У тебя есть идеи?

1 Ответ

1 голос
/ 27 мая 2019

Как я уже говорил в своем комментарии, не вводите необработанные значения в ваши динамические операторы SQL.Это большая проблема с SQL-инъекцией, и нет никаких оснований когда-либо это делать.

Я подозреваю, что вы используете varchar, и комбинация использования непараметрического оператора вызывает проблему.Если это не решает проблему, вам нужно предоставить пример, который повторяет проблему (обратите внимание на предполагаемые типы данных):

DECLARE @table_name sysname,
        @textcol sysname,
        @newtext nvarchar(50), --Guessed datatype
        @id_col sysname,
        @cur_id int; --Guessed dataytpe

DECLARE @updstatement nvarchar(MAX);
SET @updstatement = 'UPDATE ' + QUOTENAME(@table_name) + N' SET ' + QUOTENAME(@text_col) + N' = @newtext WHERE ' + QUOTENAME(@id_col) + N' = @cur_id;';
PRINT @updstatement; --Your debugging friend
EXEC sp_executesql @SQL, N'@newtext nvarchar(50), @cur_id int', @newtext = @newtext, @cur_id = @cur_id;
...