2012-03-21 3 views
3

J'ai un tableau contenant environ 100 colonnes, est-il possible de faire un Sélectionnez Remplacer sur chaque colonne en même temps plutôt que de taper chaque colonne individuellement, je suis en train d'essayer '"' de chaque champ de la table.SELECT REPLACE sur chaque colonne

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

Que SGBDR est-ce pour? –

+1

Voulez-vous * sélectionner * chaque enregistrement sans les guillemets ou * mettre à jour * chaque enregistrement pour ne pas avoir de guillemets? –

+0

MS SQL Server 2008. Je veux sélectionner chaque enregistrement sans les guillemets. – AzaRoth91

Répondre

4
DECLARE @tablename nvarchar(100)= 'Test' 
DECLARE @col nvarchar(max) 
SELECT @col = coalesce(@col + ',', 'select ') + 
case when data_type in ('varchar', 'char','nvarchar', 'nchar') then 
'replace('+column_name+' , ''"'', '''') '+' as [' + column_name + ']' else '[' + column_name + ']' end 
FROM INFORMATION_SCHEMA.COLUMNS a 
WHERE table_name = @tablename 
SET @col += ' from ' + @tablename 

EXEC (@col) 
+0

Mieux que le mien :( – Phil

+0

Cette astuce coalesce() est mon nouveau favori! Merci! –

+1

C'est ici http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string – Phil

1

Puisque vous utilisez SQL Server, vous pouvez récupérer les noms de toutes les colonnes sur une table en utilisant la INFORMATION_SCHEMA, par exemple

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'yourTable' 

Vous pouvez ensuite utiliser un curseur pour itérer sur chaque nom de colonne, construire une SQL dynamique et exécuter ce en utilisant « exec sp_executesql ».

Voici ma solution:

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 
+0

Cela ne suppose pas Oracle, vous pouvez également le modifier en concat (', replace (', column_name, ',' '' '' '' ',' '' '' '' '' '' '' ''' '' '' '' '' '' – Ben

+0

OP a maintenant dit SQL Server ... donc, concat() dans SQL Server? –

0

Voici une version récursive:

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) 
+0

Je pensais que je posterais ceci pour offrir un autre moyen possible, mais @ t-clausen.dk a une version plus rapide et plus propre. –

Questions connexes