2016-09-30 115 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), '''') ; '