0

これは私の手順です:

create proc spasdf
    @sdate int,
    @edate int
as
    DECLARE @LoopCounter INT = @sdate

    WHILE  @LoopCounter <= @edate)
    BEGIN
        SET @LoopCounter  = @LoopCounter  + 1

        declare @value varchar(30)

        set @value = '['+@LoopCounter+']'

        select UserID, UserName, @value 
        from vwfinal
END

私はそれを使用して実行します:

spasdf 1,5

私の期待される結果は次のとおりです。

@value=[1],[2],[3],[4],[5]

パラメータをストアドプロシージャに渡すと、このエラーが表示されます

メッセージ 245、レベル 16、状態 1、プロシージャ spasdf、行 40
varchar 値 '[' をデータ型 int に変換するときに変換に失敗しました。

誰かが理由を知っていますか?

4

3 に答える 3

1

すべての@LoopCounter値を文字列として取得する場合。while ループの外側を宣言し、@valuewhile ループの後に select ステートメントを配置します。

create proc spasdf
@sdate int,
@edate int
as
DECLARE @value varchar(30)=''
DECLARE @LoopCounter INT = @sdate
WHILE ( @LoopCounter <= @edate)
BEGIN

    SET 

    @LoopCounter  = @LoopCounter  + 1
    set @value=@value + ',' + QUOTENAME(@LoopCounter)
END
    set @value=STUFF(@value,1,1,'')
    select UserID,UserName,@value from vwfinal

上記のコードは、すべての@LoopCounter変数を最初にカンマとともに文字列として追加します。

を使用しset @value=STUFF(@value,1,1,'')て、最初のコンマを空のスペースに置き換えます。

@LoopCounterタイプが でINTあり、それを に追加しようとしているため、変換エラーが発生しますvarchar。そうしたい場合は、変数をするCONVERT必要がありますCAST@LoopCountervarchar

古いバージョンの SQL Server を使用している場合は、以下のように必要な文字列形式を追加して作成する従来の方法を使用できます。

set @value=@value + ',[' + CONVERT(VARCHAR(100),@LoopCounter) + ']'
于 2016-09-07T06:08:54.770 に答える
0

出力を考慮して、while ループの外側で @value と select ステートメントを宣言することを検討してください。

行を置き換えてみてください:

set @value='['+@LoopCounter+']' 

これとともに:

set @value= CONCAT(@value,'['+cast(@LoopCounter as varchar)+'],')

値から最後のコンマを削除するには、次のようなものを使用できます。

Select UserID,UserName, substring(@value, 1, (len(@value) - 1)) as Value
于 2016-09-07T06:10:19.280 に答える