2012-03-21 13 views
3

私は約100列のテーブルを持っていますが、個々の列を個別に入力するのではなく、同時にすべての列を選択して置換することは可能ですか?'"'テーブルの各フィールド。すべての列のSELECT REPLACE

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

、これは何のためにRDBMSのですか? –

+1

引用符を持たない各レコードを*選択*したり、各レコードを引用符で囲まない*更新*しますか? –

+0

MS SQL Server 2008.各レコードを引用符なしで選択したいとします。 – AzaRoth91

答えて

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

より優れています:( – Phil

+0

このcoalesce()トリックは私の新しいお気に入りです!ありがとう! –

+1

それはここにありますhttp://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string – Phil

1

SQL Serverを使用しているので、INFORMATION_SCHEMAを使用してテーブルのすべての列の名前を取得できます。あなたは、その後、各列名を反復いくつかの動的SQLを構築し、この使用した「幹部sp_executesqlを」を実行するためにカーソルを使用することができます

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

。ここで

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

これはオラクルではなく、少なくともconcat( '、replace('、column_name、 '、' '' '' '' ''、 '' '' '') ') ' - ' – Ben

+0

OPはSQL ServerでSQL Serverと言っていますが、concat()はSQL Serverで –

0

再帰バージョンです:

は、ここに私のソリューションです

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

もう一つの可能​​な方法を提供するために私はこれを投稿したいと考えましたが、@ t-clausen.dkより速く、よりクリーンなバージョンを持っています。 –

関連する問題