加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 在EXEC中连接INT和VARCHAR不会产生转换错误

发布时间:2020-12-12 06:35:42 所属栏目:MsSql教程 来源:网络整理
导读:鉴于下表: USE tempdb;CREATE TABLE #T(Val INT);INSERT INTO #T VALUES (1),(2),(3),(4),(5); 我想在给定Val值的情况下使用EXEC执行动态sql查询: DECLARE @sql NVARCHAR(MAX);DECLARE @Val INT = 3;EXEC ('SELECT * FROM #T WHERE Val = ' + @Val); 执行时
鉴于下表:
USE tempdb;

CREATE TABLE #T(Val INT);
INSERT INTO #T VALUES (1),(2),(3),(4),(5);

我想在给定Val值的情况下使用EXEC执行动态sql查询:

DECLARE @sql NVARCHAR(MAX);
DECLARE @Val INT = 3;

EXEC ('SELECT * FROM #T WHERE Val = ' + @Val);

执行时没有错误,并给出正确的结果.

我的假设是这会产生错误:

Conversion failed when converting the varchar value ‘SELECT * FROM #T
WHERE Val = ‘ to data type int.

由于@Val是INT数据类型,并且根据data type precedence的规则,EXEC内的查询必须转换为INT.

我的问题是为什么EXEC的调用没有产生转换错误?

笔记:

– 我知道sp_executesql.我也不是在寻求替代方案.我只是要求解释为什么没有产生错误.

– 这个question的答案似乎并不能解释我的情况,因为问题是指VARCHAR到VARCHAR连接.

解决方法

根据 MSDN/BOL,EXEC [UTE]语句的简化语法是:
Execute a character string  
{ EXEC | EXECUTE }   
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )  
    [ AS {  USER } = ' name ' ]  
[;] 

@string_variable
Is the name of a local variable. @string_variable can be any char,varchar,nchar,or nvarchar data type. These include the (max) data types.

几点说明:

1)根据这一行({@string_variable | [N]’command_string [?]’} [** ** … n],我们可以编写类似这样的EXEC(@ var1 @ var2 @ var3)但是根据最后一段SQL Server希望这些变量具有以下字符串数据类型之一:char,nchar或nvarchar.

2)此外,此语法仅引用字符串变量(@string_variable | [N]’command_string [?]’} [… n).我相信这就是EXEC(‘SELECT * FROM #T WHERE Val =’3)的原因;失败:3不是变量.

3)我假设当其中一个变量没有上述字符串类型之一时,SQL Server将进行隐式转换.我假设它将从INT(例如)的源变量转换为NVARCHAR,因为它在这些字符串类型之间具有最高的data type precedence.

4)这不是data type precedence不起作用的唯一地方. ISNULL(param1,param2)这只是另一个例子.在这种情况下,param2将转换为param1的数据类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读