首页 > 解决方案 > MS SQL Server CAST to int 返回意外的输出

问题描述

操作系统类型:Windows SQL Server: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. 使用 Unicode 字符时,CAST 对 int 是否有任何限制?

提前致谢。

标签: sql-serverunicodeutf-8castingucs2

解决方案


尝试这个

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

推荐阅读