0

SQL Server 2008 の次のストアド プロシージャは、エラーをスローしていました。

/****** 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 + ' = '+@value+' 
    set ReportLastUpdate = ' + @thedate + '
    where RecordNum='+@RecordNum

    exec sp_executesql @cmd
    select @cmd
END

このエラーをスローしています

nvarchar 値 'Update tblTimeCPAReport set UsrsID = ' をデータ型 int に変換するときに変換に失敗しました。

4

3 に答える 3

1

サーバーが を検出するたびに、+両側の型を調べ、異なる場合は変換を実行する必要があります。

の場合' = '+@value+'、左側には文字列 ( nvarchar(max)) があり、右側にはint. 文字列を に変換することを決定しますint

これを防ぐには、intを自分で文字列に変換します。' = '+CONVERT(nvarchar(10),@value)+'

于 2012-10-29T14:12:13.643 に答える
1

パラメータ --cast()が必要です:intcast(@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='''+@RecordNum+''''

    exec sp_executesql @cmd
    select @cmd
END

あなた@cmdはデータ型nvarchar(max)であるため、使用されるすべてのパラメーターは類似している必要があります。

@value  -- use cast(@value as nvarchar(100))
@thedate --- use convert(nvarchar(25), @thedate, 120)
于 2012-10-29T14:13:05.780 に答える
1

1) @value を varchar にキャストする必要があります

2) その 2 番目の「set」はエラーを引き起こします。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 を囲む引用符を除外します)

于 2012-10-29T14:21:01.287 に答える