2012-06-04 62 views
2

我会提前警告你,这个问题的界限很愚蠢,但我仍然在问。有没有办法在所有字段中替换字符或字符串而不写入每个字段?

我的问题的动力是从查询结果和一些包含逗号的字段中创建一个csv。很明显,csv并不知道更好,只是在非现场专栏中有一些散场球员来高兴我的好心情。

我知道我可以写

Replace(FieldName, OldChar, NewChar)

每个字段,但我更好奇比什么,如果有一个快捷键来代替它们都在查询输出。

基本上就是我正在寻找(逻辑)是:

Replace(AllFields, OldChar, NewChar) 

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

+2

你有没有考虑使用不同的字段分隔符为“CSV”文件:这是我喜欢的方式(这里假设你想管来代替逗号,您认为合适的改变这一点)?例如,如果你使用pipe(|),那么它可能不会干扰任何字段。大多数导入数据的应用程序让您选择字段分隔符。 –

+0

@GordonLinoff因为太容易了,所以总是有意义的。 =)就像我说的,这比满足我的好奇心更重要。 – Yatrix

回答

3

没有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

如果您只是想为自己节省一些时间来影响表格中所有字段的一次查询语句,那么这是我过去使用的一种技巧。

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

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

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

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

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); 
+0

“FOR XML PATH”不会将任何合法的'>','<'等更改为“>”和“<”?另外,如果你打算包含模式,为什么在比较中忽略它而不是说't。[object_id] = OBJECT_ID(@tableName)'? –

+0

对不起,忽略我对XML的评论,思考太多层。但是为避免比较模式和表名,似乎很奇怪。 –

+0

@AaronBertrand是的,脚本被抽出一个更大的脚本,我只是用它来说明如何为dbo.YourTable构建一个_update all column_脚本。我会更新该帖子,感谢保持诚实:) –

相关问题