我有一个问题。
declare @sql nvarchar(max)
declare @max int
set @max=10
declare @min int
set @min=0
Declare @oper nvarchar(40)
set @oper='>'
Declare @value int
set @value=0
declare @r_sql int
set @sql='select @r_sql = case when'+cast(@value as int)+cast(@oper as nvarchar(1))+@min+' then 1 else 0 end '
EXEC sp_executesql
@sql,
@value,
@min,
@max,
@r_sql OUTPUT
select @r_sql
我想传递动态运算符来执行查询,但它总是说'错误将数据类型varchar转换为数字。' 有人有这个问题吗?请帮我。谢谢,我真的很感激。
答案 0 :(得分:1)
t-sql中的+
运算符可能有点不稳定。如果要连接字符串,请确保仅输入字符串:
set @sql=N'select @r_sql = case when'
+cast(@value as nvarchar(max))
+@oper --already a nvarchar, and the length thing is done automatically
+cast(@min as nvarchar(max))
+N' then 1 else 0 end '
基本上,SQL Server所做的是,当它看到+
时,它的第一直觉是添加两个数字。
+
两侧的内容都是数字,则会添加它们所以,简而言之:
select 1+2 => yields the number 3
select 1+'2' => yields the number 3
select '1'+2 => yields the number 3
select '1'+'2' => yields the string '12'
select 1+'a' => Conversion failed error
select 'a'+2 => Conversion failed error
select 'a'+'b' => yields the string 'ab'
或者,如果您使用的是SQL Server 2012及更高版本,则可以使用concat
函数,该函数基本上将您提供的所有内容转换为字符串,然后连接字符串
set @sql=concat(N'select @r_sql = case when',
@value, @oper, @min,
N' then 1 else 0 end ')