2014-04-14 77 views
1

我遇到問題。SQL中的動態運算符

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))[email protected]+' then 1 else 0 end ' 

EXEC sp_executesql 
    @sql, 
    @value, 
    @min, 
    @max, 
    @r_sql OUTPUT 
select @r_sql 

我想通過動態運算符來執行查詢,但它總是說'將數據類型varchar轉換爲數字時出錯。 任何人都有這個問題嗎?請幫幫我。謝謝,我真的很感激。

+0

@value已經是一個int,爲什麼你明確CASTI NG? –

+0

因爲當我聲明var我需要是int,但是當我傳遞參數來查詢我認爲需要是字符串。 –

回答

1

t-sql中的+運算符可能有點不可靠。如果你想連接字符串,請確保輸入的字符串只:

set @sql=N'select @r_sql = case when' 
      +cast(@value as nvarchar(max)) 
      [email protected] --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 ') 
+0

感謝您的支持,我會檢查它;) –