2016-04-01 4 views
0

私は別のストアドプロシージャまたは関数を呼び出して実行することによって作成されるテーブル名resultadoを持っています。結果として、 '111100001'のようなベクトルとして '1'と '0'を含む列があります。また、私はそれに続くように 'ベクター'の1の数を数えるストアを手配しました。テーブルの列に対するストアプロシージャのアクションの結果でテーブルを更新します。

ALTER PROC [dbo].[CharCount](@String VARCHAR(4000),@caracter VARCHAR(2)) 
AS 
BEGIN 
DECLARE @long INT 
DECLARE @numeroveces INT =0 
DECLARE @consecutivo INT =0 
DECLARE @consecutivo1 INT =0 
SET @numeroveces=0 
SET @long=LEN(@String) 

WHILE @long>=0 
BEGIN 
IF @caracter=SUBSTRING(@String,@long,1) 
BEGIN 
      set @numeroveces = @numeroveces + 1 
      set @consecutivo = @consecutivo + 1 
END 
IF @caracter<>SUBSTRING(@String,@long,1) or (@long = 0) 
BEGIN 
    IF @consecutivo > @consecutivo1 
     BEGIN 
      set @consecutivo1 = @consecutivo 
     END 
    set @consecutivo = 0 
END 
SET @[email protected] 
END 
SELECT @numeroveces 
SELECT @consecutivo1 
END 

私が必要とするのは、自分のテーブルresultadoから列のストアプロシージャを実行し、カラムの結果をSPで更新することです。

OriginalColumn ---> SPResult ----> UpdatedColumn

110111 ---> 5 ----> 5

+0

OriginalColumnの各値に手続きを実行して更新しますか? – Marusyk

+0

このコードで何をしようとしていますか?ここではループの必要はないようです。特定の文字が文字列内にある回数を数えているようですね。 –

+0

@MegaTronはい元の列の各値にプロシージャを実行したいです。 –

答えて

0

あなたの手順では、2の結果は、あなたはそれがコード化されている方法を設定しています。あなたがここに投稿した例では、あなたはこの手続きを使わないことを強くお勧めします。このような単純な作業には、ひどく非効率的です。この単純なコードは、ループを行わずに文字の出現回数を取得します。発生の最長連続カウントが必要な場合は、それを行うためのより良い方法もあります。

declare @String varchar(4000) = '111100001' 
    , @caracter VARCHAR(2) = '1' 

select LEN(@String) - LEN(Replace(@String, @caracter, '')) 
+0

Seanはい1つの列のために私は出現の数を使用し、連続する他の列に両方の結果が必要です。あなたのソリューションは、最初のケースでは正しいです。このプロジェクトでは、カラムを更新するためのストアドプロシージャを多く使用しています。 –

+0

OK。私はここでいくつかの会議に向かわなければならないが、私は数時間後に確認し、何が起こったのかを見るだろう。誰もあなたを助けないなら、私はあなたのためにこれに対してループのないアプローチを試してみます。 –

関連する問題