2016-09-30 116 views
2

我试图在SQL Server中的表中替换CRLF字符。一列的声明的工作原理是这样的:遍历列的SQL循环并执行REPLACE语句

select REPLACE(REPLACE(col_name,char(13),''), char(10), '') from table_name 

现在我想对我的表中的每一列重复一遍。我有以下脚本,不工作:

Declare @sql varchar(max) = '' 

select @sql = @sql + 'select [' + c.name + '] REPLACE(REPLACE(' + c.name + ', char(13),''), char(10), '') from [' + t.name + ']; ' 
from sys.columns c 
inner join sys.tables t on c.object_id = t.object_id 
where t.name = table_name 

EXEC (@sql) 

不幸的是,这并不工作,我得到了以下错误:

Msg 102, Level 15, State 1, Line 24 
Incorrect syntax near 'REPLACE'. 
Msg 102, Level 15, State 1, Line 24 
Incorrect syntax near 'REPLACE'. 
Msg 102, Level 15, State 1, Line 24 
Incorrect syntax near 'REPLACE'. 
Msg 102, Level 15, State 1 
+0

刚注意到,你使用select,但是如果你想摆脱那个,你需要更新。添加到我的答案。 – gofr1

回答

2

两件事情; 正如其他答案 所指出的那样,在初始[c.name]之后需要有一个逗号。另外,要在字符串中获得单引号,则需要两个单引号。因此,要将两个单引号放在一起,您需要四个单引号。

select @sql = @sql + 'select [' + c.name + '], REPLACE(REPLACE(' + c.name + ', char(13),''''), char(10), '''') from [' + t.name + ']; ' 
    from sys.columns c 
    inner join sys.tables t on c.object_id = t.object_id 
    where t.name = 'table_name' 

    exec (@sql) 

注:print(@sql)对调试这类问题有很大的帮助!

+0

你有不一致的方括号用法。说实话,你不应该在这种情况下使用它们。你应该消除括号,而是使用QUOTENAME。如果在名称中有一个括号,它会像这样硬编码,它会崩溃。一旦你保持一致,使用它们就足够重要。这仍然是一个很好的答案,值得+1。 –

1

你可以试试这个方法,变量未设置替换为值,引号不是双引号...

Declare @sql varchar(max) = '' 

select @sql = @sql + 'select [' + c.name + '] = REPLACE(REPLACE(' + c.name + ', char(13),''''), char(10), '''') from [' + t.name + ']; ' 
from sys.columns c 
inner join sys.tables t on c.object_id = t.object_id 
where t.name = 'commasep' 

select @sql 
2

添加引号,删除第一c.name或添加逗号,而不是添加[]使用QUOTENAME :

Declare @sql varchar(max) = '' 

select @sql = @sql + 'select ' + QUOTENAME(c.name) + ', REPLACE(REPLACE(' + QUOTENAME(c.[name]) + ', char(13),''''), char(10), '''') from ' + QUOTENAME(t.[name]) + '; ' 
from sys.columns c 
inner join sys.tables t 
    on c.object_id = t.object_id 
where t.[name] = 'table_name' 

EXEC (@sql) 

编辑

如果您需要更新变化@sql部分:

select @sql = @sql + 'UPDATE ' + QUOTENAME(t.[name]) + ' SET ' + QUOTENAME(c.name) + ' = REPLACE(REPLACE(' + QUOTENAME(c.[name]) + ', char(13),''''), char(10), '''') ; '