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

有没有办法替换sql中的(*)?,sql,sql-server,replace,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

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

select 
    [BadData], [WorseDate], [IQuitData]
into 
    #BadDataTempTable
from 
    SomeoneElsesMess
Select 
    Replace(#BadDataTempTable.*, ',', ' ')
from 
    #BadDataTempTable -- Replace all commas in every column `with a space--`
我现在想做的是类似于:

select 
    [BadData], [WorseDate], [IQuitData]
into 
    #BadDataTempTable
from 
    SomeoneElsesMess
Select 
    Replace(#BadDataTempTable.*, ',', ' ')
from 
    #BadDataTempTable -- Replace all commas in every column `with a space--`
这可能吗?如果是,请告诉我最简单(非功能)的方法


谢谢。我想是SQLServer2012。我使用的是SSMS 17

否,必须指定列。您可以使用动态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

就在OP询问您如何在动态SQL中实现这一点之后,下面是我的方法。基本上,获取表模式信息并连接所有列,以及使用
forxml
所需的
REPLACE
逻辑。这基本上构造了Rigerta posted语句,但它是动态执行的

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之前清理,但现实很少公平。

不,这是不可能的。您必须为每一列执行
REPLACE
。您可以手动(用REPLACE写出所有列名)或动态(如果列太多,您可以使用此选项并从例如information\u schema.columns中检索列名)。也就是说,如果数据有那么糟糕,我不确定这样的替换会起什么作用……我不太确定你说的动态是什么意思。你能给我看一下吗?这对我来说有点太高级了,有什么医生可以让我看一下吗?我也不想更新表格。只有输出需要替换、。为了更好的上下文,我们将从sql中获取数据并“导出”为.csv,然后将该.csv导入SalesForce。您需要调整第7行(将“some_table”更改为您的表名)。此SQL块将获取给定表的所有列,并输出您可以执行的查询。