varchar 值 'select ' 转换为数据类型为 int 的列时报错

来源:互联网 发布:手机淘宝活动怎么报名 编辑:程序博客网 时间:2024/05/17 08:39
 

If  Exists(select name from sysobjects  where name  =  'pagecourr'  and type   =  'P')  

drop proc pagecourr

Go create proc pagecourr(

@pagesize int=12,

@database nvarchar(50)='',

@sql nvarchar(200)=''

)

as

set @sql='select top '+@pagesize+' * from '+@database+' order by id'

execute sp_executesql @sql

 

原因:因为“+”运算符后面跟着的是int,所以编译器认为是数学计算,所以尝试对第一个表达式进行转型,在数学运算和文本连接两者间,数学运算是具有高优先级的

拓展:当两个不同数据类型的表达式用运算符组合后,数据类型的优先顺序规则确定哪种数据类型要向另一种转换。优先顺序低的数据类型向优先顺序高的数据类型转换。如果此转换不是所支持的固有转换,则返回错误。当两个操作数表达式有相同的数据类型时,运算的结果就为那种数据类型。

数据类型的优先顺序(从高到低):

sql_variant(最高)、datetimesmalldatetimefloatrealdecimal

moneysmallmoneybigintintsmallinttinyintbitntexttext

imagetimestampuniqueidentifiernvarcharncharvarcharchar

varbinarybinary(最低)

解决方案:

   用convert(数据类型,变量或字符串)或者是cast(@变量 as  varchar(20))进行数据类型转换。