2012-10-29 47 views
0

在SQL Server 2008下面的存儲過程中拋出一個錯誤SQL Server存儲過程的參數的數據類型的錯誤

/****** Object: StoredProcedure [dbo].[UpdateCPA] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[pdateCPA_INT] 
    @CPAColumn_Name nvarchar(100), @value Int, @RecordNum nvarchar(100) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    --declare @CPAColumn_Name nvarchar(100) = 'UsrsID' 
    --declare @value Int = 3575 
    --declare @RecordNum int = 1 

    declare @thedate smalldatetime 
    set @thedate = GETDATE() 
    --select @thedate as NOW 

    declare @cmd nvarchar(max) 

    set @cmd = 'Update tblTimeCPAReport 
    set ' + @CPAColumn_Name + ' = '[email protected]+' 
    set ReportLastUpdate = ' + @thedate + ' 
    where RecordNum='[email protected] 

    exec sp_executesql @cmd 
    select @cmd 
END 

它拋出這個錯誤轉換nvarchar的值時

轉換失敗「更新 tblTimeCPAReport設置UsrsID ='爲數據類型int。

回答

1

您需要cast()int參數 - cast(@value as nvarchar(100))

/****** Object: StoredProcedure [dbo].[UpdateCPA] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[pdateCPA_INT] 
    @CPAColumn_Name nvarchar(100), @value Int, @RecordNum nvarchar(100) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    --declare @CPAColumn_Name nvarchar(100) = 'UsrsID' 
    --declare @value Int = 3575 
    --declare @RecordNum int = 1 

    declare @thedate smalldatetime 
    set @thedate = GETDATE() 
    --select @thedate as NOW 

    declare @cmd nvarchar(max) 

    set @cmd = 'Update tblTimeCPAReport 
    set ' + @CPAColumn_Name + ' = '''+cast(@value as nvarchar(100))+''' 
     , ReportLastUpdate = ''' + convert(nvarchar(25), @thedate, 120) + ''' 
    where RecordNum='''[email protected]+'''' 

    exec sp_executesql @cmd 
    select @cmd 
END 

由於您@cmd是數據類型nvarchar(max)所有的參數正在使用需要類似,包括:

@value -- use cast(@value as nvarchar(100)) 
@thedate --- use convert(nvarchar(25), @thedate, 120) 
+0

好吧,所以我實際上不必爲每個數據類型設置不同的SP,因爲它根據值類型和數據庫容器爲它自己找出了一個文本句子,確保我沒有「違反規則」,這就是它所需要的。 @ – LoneXcoder

+0

@LoneXcoder你可以以正確的格式傳遞數據類型,但是當你將它添加到你的'@ cmd'時,它將需要與那個變量相同的數據類型,否則它將不兼容 – Taryn

+0

我希望你不介意它仍然拋出一個錯誤,雖然我已經解決了更復雜的問題然後這個簡單的我不能把我的手指放在哪裏出錯我會更新我的問題請按照 – LoneXcoder

1

每當服務器看到一個+,它會檢查雙方的類型,如果他們是不同的,它必須執行轉換。

對於' = '[email protected]+',在左邊我們有一個字符串(nvarchar(max))在右邊int。它決定將字符串轉換爲int

爲了防止這種情況,int自己轉換爲字符串:' = '+CONVERT(nvarchar(10),@value)+'

+0

,謝謝,我忘了感謝你呢! – LoneXcoder

1

1)你應該投@value爲varchar

2)即第二「設置」將導致錯誤,propt語法是SET <col> = <values> [, <col> = Value>, …]

3)鑄@thedate作爲varchar和括在引用

4)如果@Recordnum是一個字符串,把引號圍繞它爲好,否則,最好

使用上述所有的下列情況:

set @cmd = 'Update tblTimeCPAReport 
set ' + @CPAColumn_Name + ' = ''' + cast(@value as varchar(10)) + ''' 
set ReportLastUpdate = ''' + convert(varchar(50), @thedate, 109) + ''' 
where RecordNum = ''' + @RecordNum + '''' 

應該產生這樣的字符串:

Update tblTimeCPAReport 
set <CPAColumn_Name> = <@value> 
    ,ReportLastUpdate = '<@thedate>' 
where RecordNum = '<@RecordNum>' 

(因子出周圍@RecordNum報價,如果它是包含一個數值)

+0

非常感謝你現在只是工作 – LoneXcoder

+0

我會從中學習,謝謝大家的迴應! – LoneXcoder