Sql 在每列上选择“替换”

Sql 在每列上选择“替换”,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个包含大约100列的表,是否可以同时对每一列执行Select Replace而不是单独键入每一列,我正在尝试修剪表中每个字段的“” SELECT REPLACE(*, '"', '') 由于您使用的是SQL Server,因此可以使用信息模式检索表上所有列的名称,例如 select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'yourTable' 然后,您可以使用游标在每个列名上迭代,构建一些动

我有一个包含大约100列的表,是否可以同时对每一列执行Select Replace而不是单独键入每一列,我正在尝试修剪表中每个字段的

SELECT
    REPLACE(*, '"', '')

由于您使用的是SQL Server,因此可以使用信息模式检索表上所有列的名称,例如

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'yourTable'
然后,您可以使用游标在每个列名上迭代,构建一些动态SQL,并使用“exec sp_executesql”执行此操作

以下是我的解决方案:

declare @isString bit
declare @tableName nvarchar(256) = N'MyTableName'
declare @columnName nvarchar(max)
declare @sql nvarchar(max) = ''

declare c cursor local forward_only read_only for 
    select column_name, case when CHARACTER_SET_NAME is null then 0 else 1 end as IsString
    from information_schema.COLUMNS WHERE table_name = @tableName

open c

fetch next from c into @columnName, @isString

set @sql = N'select '

declare @first bit = 1

while @@FETCH_STATUS = 0
begin
    select @columnName

    if @isString <> 0 
    begin
        if @first = 0
        begin
            set @sql = @sql + ', '
        end

        set @sql = @sql + N'REPLACE(' + @columnName + ', ''"'', '''')'
        set @first = 0
    end

    fetch next from c into @columnName, @isString
end

close c
deallocate c

set @sql = @sql + ' from ' + @tableName

exec sp_executesql @sql
声明@isString位
声明@tableName nvarchar(256)=N'MyTableName'
声明@columnName nvarchar(最大值)
声明@sql nvarchar(最大值)=”
声明c游标本地前进仅为只读
选择列\u name,当字符\u SET\u name为空时,选择大小写,然后选择0或1作为IsString结束
来自信息\u schema.COLUMNS,其中表\u name=@tableName
开c
从c获取下一个到@columnName、@isString
设置@sql=N'select'
声明@first bit=1
而@@FETCH\u STATUS=0
开始
选择@columnName
如果@isString 0
开始
如果@first=0
开始
设置@sql=@sql+,'
结束
set@sql=@sql+N'REPLACE('+@columnName+','','','')
设置@first=0
结束
从c获取下一个到@columnName、@isString
结束
关闭c
解除分配c
从“++@tableName”设置@sql=@sql++”
exec sp_executesql@sql

这里是一个递归版本:

declare @TABLE_NAME sysname = 'MyTableName'
declare @Prefix nvarchar(128) = 'REPLACE('
declare @Suffix nvarchar(128) = ', ''"'', '''')'
declare @Sql nvarchar(max)

;with Cols (TABLE_NAME, SELECT_LIST, ITERATION) as
(
    select TABLE_NAME
        , cast('' as nvarchar(max)) as SELECT_LIST
        , 0 as ITERATION
    from INFORMATION_SCHEMA.TABLES
    where TABLE_NAME = @TABLE_NAME
    union all
    select c.TABLE_NAME
        , c.SELECT_LIST
            + case when len(c.SELECT_LIST) > 0 then ', ' else '' end
            + case when i.DATA_TYPE like '%char' then @Prefix else '' end
            + cast(i.COLUMN_NAME as nvarchar(128))
            + case when i.DATA_TYPE like '%char' then @Suffix + ' as ' + cast(i.COLUMN_NAME as nvarchar(128)) else '' end
        , c.ITERATION + 1
    from INFORMATION_SCHEMA.COLUMNS i
        join Cols c on i.TABLE_NAME = c.TABLE_NAME
    where i.ORDINAL_POSITION = c.ITERATION + 1
)
select @Sql = ('select ' + a.SELECT_LIST + ' from ' + a.TABLE_NAME)
from Cols a
    join (
        select TABLE_NAME, max(ITERATION) as ITERATION
        from Cols
        group by TABLE_NAME
    ) as b on a.TABLE_NAME = b.TABLE_NAME
        and a.ITERATION = b.ITERATION

exec (@sql)

是否要选择不带引号的每条记录,或将每条记录更新为不带引号?MS SQL Server 2008。我想选择不带引号的每条记录。这假设不是Oracle,而且您至少可以将其更改为
concat(',replace(',column_name',''''','''''','''''''))
-我想-这样您就不需要全部键入了。OP现在说的是SQL Server…所以,concat()在SQL Server中?我想我会发布这篇文章来提供另一种可能的方法,但是@t-clausen.dk有一个更快、更干净的版本。它在这里
declare @TABLE_NAME sysname = 'MyTableName'
declare @Prefix nvarchar(128) = 'REPLACE('
declare @Suffix nvarchar(128) = ', ''"'', '''')'
declare @Sql nvarchar(max)

;with Cols (TABLE_NAME, SELECT_LIST, ITERATION) as
(
    select TABLE_NAME
        , cast('' as nvarchar(max)) as SELECT_LIST
        , 0 as ITERATION
    from INFORMATION_SCHEMA.TABLES
    where TABLE_NAME = @TABLE_NAME
    union all
    select c.TABLE_NAME
        , c.SELECT_LIST
            + case when len(c.SELECT_LIST) > 0 then ', ' else '' end
            + case when i.DATA_TYPE like '%char' then @Prefix else '' end
            + cast(i.COLUMN_NAME as nvarchar(128))
            + case when i.DATA_TYPE like '%char' then @Suffix + ' as ' + cast(i.COLUMN_NAME as nvarchar(128)) else '' end
        , c.ITERATION + 1
    from INFORMATION_SCHEMA.COLUMNS i
        join Cols c on i.TABLE_NAME = c.TABLE_NAME
    where i.ORDINAL_POSITION = c.ITERATION + 1
)
select @Sql = ('select ' + a.SELECT_LIST + ' from ' + a.TABLE_NAME)
from Cols a
    join (
        select TABLE_NAME, max(ITERATION) as ITERATION
        from Cols
        group by TABLE_NAME
    ) as b on a.TABLE_NAME = b.TABLE_NAME
        and a.ITERATION = b.ITERATION

exec (@sql)