【问题标题】:Is there a way to replace a character or string in all fields without writing it for each field?有没有办法替换所有字段中的字符或字符串而不为每个字段编写它?
【发布时间】:2012-06-08 18:17:23
【问题描述】:

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

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

我知道我会写

Replace(FieldName, OldChar, NewChar)

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

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

Replace(AllFields, OldChar, NewChar)

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

【问题讨论】:

  • 您是否考虑过为“csv”文件使用不同的字段分隔符?例如,如果您使用管道 (|),那么它可能不会干扰任何字段。大多数导入数据的应用程序都允许您选择字段分隔符。
  • @GordonLinoff 因为这太容易了,而且完全有道理。 =) 就像我说的,这比什么都更能满足我的好奇心。

标签: sql sql-server-2005 replace field


【解决方案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);
    

    【讨论】:

    • 不会将FOR XML PATH 任何合法的>< 等更改为><?另外,如果您费心包含架构,为什么在比较中忽略它而不是说t.[object_id] = OBJECT_ID(@tableName)
    • 对不起,忽略我对 XML 的评论,想的太多了。但是特意避免将模式与表名进行比较似乎很奇怪。
    • @AaronBertrand 是的,该脚本是从一个更大的脚本中提取出来的,我只是用它来说明如何为 dbo.YourTable 构建一个 更新所有列 脚本。我会更新帖子,谢谢你让我诚实:)
    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 2018-02-24
      • 2017-06-03
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多