有没有办法在sql中替换(*)?

时间:2017-07-11 21:58:43

标签: sql sql-server replace

所以我只是在做类似的事情:

select 
    [BadData], [WorseDate], [IQuitData]
into 
    #BadDataTempTable
from 
    SomeoneElsesMess

我现在想做的事情类似于:

Select 
    Replace(#BadDataTempTable.*, ',', ' ')
from 
    #BadDataTempTable -- Replace all commas in every column `with a space--`

这可能吗?如果是这样,请告诉我最简单(非功能)的方法。

感谢。我认为是SQL Server 2012。我正在使用SSMS 17

2 个答案:

答案 0 :(得分:1)

不,必须指定列。您可以使用动态SQL来构建更新/查询。然后只需从结果中复制所需的命令。

也许这有助于您入门:

BEGIN
    -- Set the replace value
    DECLARE @ls_replaceValue NVARCHAR(MAX) = ',';
    -- Set the with value
    DECLARE @ls_withValue NVARCHAR(MAX) = ' ';
    -- Set the table name we want to query 
    DECLARE @ls_table NVARCHAR(MAX) = 'some_table';

    -- Get all of the columns and provide the replace parameters
    DECLARE @ls_columns NVARCHAR(MAX) = '';
    SELECT  @ls_columns = @ls_columns + ', ' + name + ' = REPLACE(' + name + ', ' + '' + '''' + REPLACE(@ls_replaceValue, '''', '''''''') + '''' + ', ' + '''' + REPLACE(@ls_withValue, '''', '''''''') + '''' + ')'
    FROM    sys.all_columns
    WHERE   object_id = OBJECT_ID(@ls_table)
        AND collation_name IS NOT NULL; -- Skip columns that aren't character based

    -- Remove the first ', ' from the column list
    SET @ls_columns = SUBSTRING(@ls_columns, 3, LEN(@ls_columns));
    IF @ls_columns = ''
    BEGIN
        PRINT 'Table not found'
        RETURN
    END

    -- Build a query
    DECLARE @ls_query_sql NVARCHAR(MAX) = '';
    SET @ls_query_sql = 'SELECT ' + @ls_columns + ' FROM ' + @ls_table;

    -- Show the results
    SELECT @ls_query_sql AS querySQL;
END

答案 1 :(得分:0)

就在OP询问您如何在动态SQL中执行此操作之后,我们将如何处理它。基本上获取表模式信息并连接所有列,以及使用REPLACE所需的FOR XML逻辑。这基本上构成了Rigerta发布的声明,但它是动态的。

use tempdb
go

if object_id('tempdb.dbo.#SomeoneElsesBadData') is not null drop table #SomeoneElsesBadData
create table #SomeoneElsesBadData
(
    BadData varchar(250),
    WorseData varchar(250),
    IQuitData varchar(250)
)

declare @sql nvarchar(max)

select @sql = 'select ' 
    + stuff((select ', ' 
                 + name 
                 + ' = replace(' + name + ''','', '''')'
             from tempdb.sys.columns
             where object_id = object_id('tempdb.dbo.#SomeoneElsesBadData')
             for xml path('')), 1, 1, '')
    + ' into #BadDataTempTable
        from #SomeoneElsesBadData'

exec sp_executesql @sql

在所有条件相同的情况下,数据应该在进入SQL之前进行清理,但现实很少是公平的。