2012-10-29 49 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