Sql server 使用游标在存储过程循环中动态构建SQL语句
我试图构建一个动态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)
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中循环的性能通常很糟糕。如果我知道另一种方法的话,我会尽量绕开它。有什么想法吗?对于这种情况,没有,因为您正在寻找所有可以是动态的列名。我只是做了个一般性的准备。