Обновить неанглийские данные в хранимой процедуре с помощью переменной?

У меня есть хранимая процедура, которая принимает переменную, содержащую данные не на английском языке. Я знаю, что мы можем использовать N для этого. Но он не работает с переменными. Как я могу добиться этого?

Я хочу сделать что-то подобное, но это не работает. Ниже моя хранимая процедура.

Create Procedure tempUpdateCustomerSurvey
(
    @FeedbackText nvarchar(1000)
)
As
Begin
    Update  tblCustomerSurvey
    Set     GeneralFeedbackText = @FeedbackText
    Where   CustomerSurveyID = 1000 
End

Он хранит '??????' в таблице.

Если я выполню этот SP с данными, как показано ниже, он не сработает.

Declare @GeneralFeedbackText Nvarchar(1000) = 'नमस्कार'
Exec tempUpdateCustomerSurvey @GeneralFeedbackText

Знайте, что хранимая процедура принимает данные из кода C#. Ниже приведен основной метод C#, который вызывает хранимую процедуру.

public static Feedback InsertSurvey(int CustomerSurveyID, string GeneralFeedbackText)
   {
        try
        {
            int intDBReturnValue = Convert.ToInt32(SqlHelper.ExecuteScalar(SystemSettings.GetDBConnection(),
                                                                "tempUpdateCustomerSurvey",
                                                                CustomerSurveyID,
                                                                GeneralFeedbackText));

            Feedback f = new Feedback(FeedbackService.DB_OP_SPECIFICATION.INSERT, intDBReturnValue, "Customer survey");
            f.ProcessExceptionOrCustomErrorIfAvailable(-1, "System couldn't verify the survey information.");
            return f;
           }
           catch (Exception ex)
           {
                return new Feedback(FeedbackService.DB_OP_SPECIFICATION.INSERT, ex, "Customer survey");
           }
      }

person Komal R    schedule 10.02.2020    source источник
comment
Проблема заключается в способе инициализации значений переменных: в первом примере вы НЕ используете префикс N для строкового литерала, поэтому он преобразуется обратно в строка varchar не в формате Unicode - вот почему вы получаете эти вопросительные знаки в своей таблице.... работает так, как задумано - просто всегда используйте префикс N при инициализации переменных nvarchar из строки литералы!   -  person marc_s    schedule 10.02.2020
comment
Если вы уже знаете, что второй фрагмент кода работает, что вы здесь спрашиваете. Как я могу добиться этого? - используйте фрагмент, который работает   -  person Martin Smith    schedule 10.02.2020
comment
вам нужно показать код вызова. Если вы передаете строковый литерал, он должен выглядеть как EXEC tempUpdateCustomerSurvey N'Yorvalue', а не EXEC tempUpdateCustomerSurvey 'Yorvalue'   -  person Martin Smith    schedule 10.02.2020
comment
Если это хранит '??????', то вы передали 'नमस्कार' в свой параметр, а не N'नमस्कार'. Это мы можем сделать безопасный вывод. Вам нужно исправить, как вы вызываете SP.   -  person Larnu    schedule 10.02.2020
comment
@Larnu Как я могу исправить, как я вызываю SP? Как мне позвонить в СП?   -  person Komal R    schedule 10.02.2020
comment
Вы бы сделали EXEC dbo.tempUpdateCustomerSurvey @FeedbackText = N'नमस्कार'; @KomalR . (Предположим, что схема по умолчанию — dbo, поскольку SP был создан без объявленной схемы.)   -  person Larnu    schedule 10.02.2020
comment
Как вы называете это в данный момент? Прямо ADO.NET? Если это так, просто убедитесь, что @FeedbackText использует параметр и имеет правильный тип данных.   -  person Martin Smith    schedule 10.02.2020
comment
@KomalR, ты только что удалил самую важную часть вопроса. Теперь это бессмысленно и должно быть закрыто как can't reproduce. Опубликуйте, как строка, которая передает неанглийский текст. Вот где проблема   -  person Panagiotis Kanavos    schedule 10.02.2020
comment
@KomalR между прочим, все библиотеки SQL Server отлично работают с Unicode - при условии, что вы передаете текст как Unicode вместо ASCII. Если вы используете конкатенацию строк (плохая идея сама по себе) и забываете N, вы используете ASCII. Если вы используете параметризованные запросы с nvarchar параметрами, у вас не будет проблем   -  person Panagiotis Kanavos    schedule 10.02.2020
comment
Строки @KomalR .NET имеют кодировку Unicode. Строки Windows имеют Юникод. ADO.NET отлично работает с Unicode, и ваш собственный вопрос доказывает это. Проблема заключается в ошибке в коде C#. Выложи код клиента   -  person Panagiotis Kanavos    schedule 10.02.2020
comment
@GeneralFeedbackText Nvarchar(1000) = 'नमस्कार' вы забыли здесь префикс N, поэтому строка обрабатывается как ASCII. Однако если вы используете параметризованные запросы в C#, вам вообще не придется об этом беспокоиться.   -  person Panagiotis Kanavos    schedule 10.02.2020
comment
Что такое SqlHelper? Используете ли вы древние блоки приложений Microsoft? Если да, то похоже, что должен получить правильный тип данных параметра из кода здесь agilechai.com/source/SqlHelper-Source-Code-cs.html. Вы можете попробовать передать параметры вместо необработанных значений, чтобы убедиться, что используется правильный тип (и вызвать перегрузку ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)   -  person Martin Smith    schedule 10.02.2020
comment
Хотя на самом деле вы должны вызывать ExecuteNonQuery в любом случае, поскольку хранимый процесс не возвращает скалярный результат.   -  person Martin Smith    schedule 10.02.2020


Ответы (1)


Проблема здесь

Declare @FeedbackText nvarchar(1000) = 'नमस्कार'

Вы должны использовать префикс N вот так

Declare @FeedbackText nvarchar(1000) = N'नमस्कार'

Посмотрите на следующее изображение, чтобы узнать разницу между ними.

введите здесь описание изображения

person Nguyễn Văn Phong    schedule 10.02.2020
comment
Пожалуйста, прочитайте мой вопрос правильно. Я знаю, что префикс N к строке работает, но у меня есть динамический SP, который принимает данные из кода C#. - person Komal R; 10.02.2020
comment
Итак, вы просто объявляете тип параметра @FeedbackText как Nvarchar(1000) - person Nguyễn Văn Phong; 10.02.2020
comment
Это не работает. - person Komal R; 10.02.2020
comment
@KomalR - в вашем вопросе ничего не говорится о динамическом SP (что бы это ни было), и неясно, в чем ваша проблема. Если вы создаете строковый литерал, добавьте к нему N. Если вы используете параметр, убедитесь, что он равен nvarchar. Если у вас есть код, который не работает, добавьте его в свой вопрос, чтобы мы могли увидеть, что вы делаете неправильно. - person Martin Smith; 10.02.2020
comment
Да я понял, не стал уточнять. Я обновил свой вопрос. - person Komal R; 10.02.2020
comment
@KomalR это работает, и вы сами это доказали - SO - это сайт .NET, хранящий данные в SQL Server в nvarchar полях. Иначе вы не смогли бы опубликовать नमस्कार. Если у вас есть проблемы, это ваш код C# - person Panagiotis Kanavos; 10.02.2020
comment
Хорошо, не могли бы вы сказать мне, в чем может быть проблема с моим кодом C #? тип данных переменной в коде C# — строка. - person Komal R; 10.02.2020
comment
@KomalR опубликуйте свой код. Переменная представляет собой строку, но как передать этот параметр? Вы использовали конкатенацию строк? Это ошибка. Вы использовали параметризованные запросы? Какой тип вы указали для параметра? NVarchar или Varchar? Если вы использовали конкатенацию строк, использовали ли вы префикс N? - person Panagiotis Kanavos; 10.02.2020
comment
@KomalR, и я повторю это - ваш собственный вопрос доказал, что Unicode работает только в .NET. В противном случае вы не сможете опубликовать नमस्कार, а я не смогу опубликовать Αυτό Εδώ, не связавшись с SO. Две кодовые страницы не могут быть дальше друг от друга, и тем не менее обе они прекрасно отображаются в одной строке. - person Panagiotis Kanavos; 10.02.2020
comment
С моей точки зрения, вы должны поймать профиль, чтобы проверить значение, отправленное из C# в SQL, чтобы иметь возможность точно знать, что такое значение @FeedbackText. - person Nguyễn Văn Phong; 10.02.2020
comment
От HTML до кода позади я получаю значение как есть, но оно не сохраняет его в БД как есть. - person Komal R; 10.02.2020