Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用游标在存储过程循环中动态构建SQL语句_Sql Server - Fatal编程技术网

Sql server 使用游标在存储过程循环中动态构建SQL语句

Sql server 使用游标在存储过程循环中动态构建SQL语句,sql-server,Sql Server,我试图构建一个动态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)

我试图构建一个动态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语句运行亚秒返回

我错过了什么


谢谢

您在begin块中丢失了下一个获取。因此,光标值永远不会更改。这就像在带有计数器的简单循环中忘记I=I++或I=I+1一样

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

好啊它去哪里了?没问题。另请注意,在SQL中,循环通常是最后的手段。无论如何都要避免它们,因为SQL中循环的性能通常很糟糕。如果我知道另一种方法的话,我会尽量绕开它。有什么想法吗?对于这种情况,没有,因为您正在寻找所有可以是动态的列名。我只是做了个一般性的准备。