MS SQL Сервер CAST к int возвращает неожиданный вывод - PullRequest
0 голосов
/ 05 марта 2020

Тип ОС: Windows SQL Сервер: 2017 Сортировка: SQL_Latin1_General_CP1_CI_AS

У меня есть хранимая процедура, как показано ниже

USE [test]
GO

ALTER PROCEDURE [dbo].[output_test]   
    @output nvarchar(250)
AS
BEGIN

    SELECT CAST(@output AS int)
END

Вход в процедуру: '1234' Я использую Функция MultiByteToWideChar () для преобразования из UTF8 в UCS2 перед передачей в процедуру. Выход функции MultiByteToWideChar () - «1111». Но когда процедура выполняется, я получаю сообщение об ошибке, как показано ниже:

Conversion failed when converting the nvarchar value '1234.' to data type int.

Отмечено, что добавлен дополнительный символ '.' добавляется в конце.

Но когда мы только что получили данные без приведения (SELECT), они имеют правильное значение как 1234

Я выделил (strlen + 1) * sizeof (SQLWCHAR) = > (4 + 1) * 2 = 10 байт для хранения результирующей широкой строки символов, которая выводится из функции MultiByteToWideChar. Здесь дополнительные 2 байта выделяются для нулевого завершения.

Однако, если эти дополнительные 2 байта для нулевого завершения не добавляются, процедура работает нормально.

  1. Может ли кто-нибудь помочь мне в понимании почему дополнительные байты вызывают проблему (хотя это 0, это приводит к '.')?
  2. Есть ли какое-либо ограничение с CAST для int при использовании символов Unicode?

Заранее спасибо.

1 Ответ

0 голосов
/ 05 марта 2020

ПОПРОБУЙТЕ

alter PROCEDURE Test (@YesNo VARCHAR(5) OUTPUT)
AS
BEGIN

    SET NOCOUNT ON;
    SET @YesNo = 1

END
GO


DECLARE @Result VARCHAR(5)

EXEC Test @YesNo = @Result OUTPUT

SELECT @Result
...