SQL中的动态运算符

时间:2014-04-14 08:45:09

标签: sql sql-server-2012 operators

我有一个问题。

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转换为数字。' 有人有这个问题吗?请帮我。谢谢,我真的很感激。

1 个答案:

答案 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所做的是,当它看到+时,它的第一直觉是添加两个数字。

  • 如果+两侧的内容都是数字,则会添加它们
  • 如果其中一个是数字,它将尝试转换另一个并添加它们(如果转换失败,则会收到您发布的错误消息)
  • 如果两者都不是数字,那么只有那时SQL Server才会尝试进行字符串连接。
  • (请注意,在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 ')