2

我会提前警告你,这个问题有点愚蠢,但我还是在问。

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

我知道我会写

Replace(FieldName, OldChar, NewChar)

对于每个字段,但如果有一个快捷方式可以在查询输出中替换它们,我比什么都好奇。

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

Replace(AllFields, OldChar, NewChar)

我不知道所有的 SQL 技巧(或其中的许多技巧),所以我想也许 SO 社区可能能够启发我......或者称我为疯子。

4

3 回答 3

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;
于 2012-06-04T18:15:09.337 回答
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);
于 2012-06-04T18:11:35.157 回答
1

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

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

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

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

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

于 2012-06-04T18:07:27.750 回答