sql-server - 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 个字节,则该过程可以正常工作。
- 谁能帮我理解为什么额外的字节会导致问题(虽然它是0,但它会导致'.')?
- 使用 Unicode 字符时,CAST 对 int 是否有任何限制?
提前致谢。
解决方案
尝试这个
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
推荐阅读
- jquery - SCRIPT5007: Unable to get value of the property 'keypress': object is null or undefined
- scala - Spark 数据框连接显示意外结果 - 0 行
- summernote - 如何使用summernote在图像上放置文字
- flutter - 在连接到 Internet 时构建 Flutter Web 应用程序会给我一个内部服务器错误。?
- keyboard-shortcuts - 在Jdeveloper 11G中,如何在分析源码的同时,直接使用快捷方式跳转到接口的实现方法
- powershell - 我们可以在并行容器中运行两个进程任务吗,比如第一个线程中的 350 个文件并在第二个线程中休息
- wpf - 带有多图标的 WPF 应用程序
- html - css中是否有任何确切的先前节点?
- python - MPESA C2B 验证和确认交易无响应
- json - 在 Solr 中发布时出现未知字段错误