有没有办法在不为每个字段写入字符或字符串的情况下替换所有字段中的字符或字符串?

时间:2012-06-04 17:14:22

标签: sql sql-server-2005 replace field

我会提前警告你,这个问题接近愚蠢,但无论如何我都在问。

我的问题的推动力是从查询结果创建一个csv,并且已经有一些包含逗号的字段。显然,csv不知道更好,只是通过在非字段列中使用一些落后者来愉快地鼓舞我的好心情。

我知道我可以写

Replace(FieldName, OldChar, NewChar)

对于每个字段,但如果有一个快捷方式在查询输出中替换它们,我会比任何事情更好奇。

基本上我正在寻找的东西(逻辑)是:

Replace(AllFields, OldChar, NewChar)

我不知道所有的SQL技巧(或其中很多),所以我想也许SO社区可以启发我......或者叫我疯了。

3 个答案:

答案 0 :(得分:4)

没有SQL语法可以执行您所描述的内容,但正如您所见,有许多方法可以使用动态SQL执行此操作。这是我喜欢的方式(这假设你想用管道替换逗号,根据你的需要改变它):

DECLARE @table   NVARCHAR(511),
        @newchar NCHAR(1),
        @sql     NVARCHAR(MAX);

SELECT @table    = N'dbo.table_name',
       @newchar  = N'|', -- tailor accordingly
       @sql      = N'';

SELECT @sql = @sql + ',
  ' + QUOTENAME(name) 
    + ' = REPLACE(CONVERT(NVARCHAR(MAX), ' + QUOTENAME(name) + '),'','',''' 
    + @newchar + ''')'
  FROM sys.columns
  WHERE [object_id] = OBJECT_ID(@table)
  ORDER BY column_id;

SELECT @sql = N'SELECT ' + STUFF(@sql, 1, 1, '')  + ' 
 FROM ' + @table;

PRINT @sql;
-- EXEC sp_executesql @sql;

答案 1 :(得分:2)

我感觉到你的痛苦。我经常在ETL例程中进行一次性类型清理步骤。当你需要从导入中删除一些奇怪的东西(流氓分页符,空格等)时,我发现这样的脚本会有所帮助:

declare @tableName nvarchar(100) = 'dbo.YourTable';

declare @col nvarchar(max);

-- remove quotes and trim every column, kill page breaks, etc.
;with c_Col (colName)
as  (   select  c.name
        from    sys.tables t 
        join    sys.columns c on
                c.object_id = t.object_id
        where   t.object_id = object_id(@tableName)
    )
select @col = stuff(a.n, 1, 1, '')      
    from    (   select  top 100 percent
                        ',' + c.colName + '= nullif(replace(replace(replace(rtrim(ltrim('+c.colName+ ')), ''"'', ''''), char(13), ''''), char(10), ''''), '''') '
                from    c_col c
                for xml path('')
            ) as a(n)

declare @cmd nvarchar(max)
set @cmd = 'update ' + @tableName + ' set ' + @col

print @cmd;
--exec(@cmd);

答案 2 :(得分:1)

如果你只是想为一个影响表中所有字段的一次性查询语句节省一些打字,那么这是我过去使用过的技巧。

首先查询模式以生成一个结果集,该结果集返回您指定的任何表中的所有字段名称。你可以修改我在这里提供的模板作为模板,但我已经给出了围绕字段名称的更新声明的基本结构。

select column_name + ' = Replace(' + column_name + ',OldChar,NewChar),' 
  from information_schema.columns
  where table_name = 'YourTableName'

结果集在查询分析器中返回为一系列行,您可以突出显示(通过单击列名称),然后将其复制并粘贴回查询分析器窗口。从那里将更新语句添加到开头,将where子句添加到结尾。 你还需要摆脱一个额外的逗号。

然后,您可以重新运行查询以产生所需的结果。