使用游标动态构建存储过程中的SQL语句显示无限循环

时间:2017-08-08 02:51:59

标签: sql-server

我正在尝试构建一个动态SQL语句,该语句从给定文件 - > db登陆表中所有列的所有值中删除引号。

类似于:

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语句运行亚秒返回。

我错过了什么?

由于

1 个答案:

答案 0 :(得分:1)

您在begin块中缺少一个fetch。因此,您的光标值永远不会改变。这就像忘记带有计数器的简单循环中的I = I ++或I = I +

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