2017-08-08 10 views
1

動的なSQL文を作成しようとしていますが、ファイル - > dbランディングテーブルのすべての列のすべての値から引用符を削除します。カーソルを使用してストアドプロシージャのSQL文を無限ループで作成する

に似た何か:私は、動的ステートメントを構築するために、このスクリプトを使用しています

Update table 
set col1 = replace(col1, '"', ''), 
    col2 = replace(col2, '"', ''), .... 

declare @query As varchar(1000) 
declare @tablename as varchar(50) 
declare @field as VARCHAR(50) 

set @tablename = 'Contact' 
set @query = 'Update [buyerhero_staging].[dbo].[Contact] SET '; 

DECLARE RecSet CURSOR FOR 
    SELECT 
     CONCAT(COLUMN_NAME, '=REPLACE(,', COLUMN_NAME, ',''"'', '''')') as setcol 
    FROM 
     INFORMATION_SCHEMA.COLUMNS 
    WHERE 
     TABLE_NAME = @tablename; 

OPEN RecSet 

FETCH NEXT FROM RecSet INTO @field 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @query = CONCAT(@query, ' ',@field, ', ') 
END 

CLOSE RecSet 
DEALLOCATE RecSet 

SELECT @query 

問題は、このスクリプトが無限ループで実行されていることと、その理由を伝えられないことです。 特にselectステートメントはsubsecondリターンを実行するためです。

私には何が欠けていますか?

ありがとうございました

+0

okです。どこに行くの? – arcee123

答えて

1

次に開始ブロック内にフェッチがありません。したがって、カーソル値は決して変更されません。カウンター付きの単純なループでI = I ++またはI = I +1を忘れるようなものです。

... 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @query = CONCAT(@query, ' ',@field, ', ') 
     FETCH NEXT FROM RecSet INTO @field 
    END 
CLOSE RecSet 
... 
+0

非常にクールです。どうもありがとうございます。 – arcee123

+0

問題ありません。 SQLループのサイドノートは、通常、最後の手段です。 SQLでのループのパフォーマンスは一般的にはひどいので、それらを避けてください。 – scsimon

+1

別の方法が分かっていたら、私はそれを巡って行きます。何か案は? – arcee123