2012-03-21 4 views
3

나는 약 100 개의 열을 포함하는 테이블을 가지고 있습니다. 각 열을 개별적으로 입력하지 않고 동시에 모든 열의 선택 바꾸기를 수행 할 수 있습니까? '"'을 다듬 으려고합니다. 테이블의 각 필드. SQL Server를 사용하고 있기 때문에모든 열의 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

, 당신은 INFORMATION_SCHEMA를 사용하여 테이블에있는 모든 컬럼의 이름을 검색 할 수 있습니다, 예를 들어,

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

는 그런 다음, 각 열 이름을 반복 커서를 사용하는 일부 동적 SQL을 구축하고이 사용하는 '간부 인 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 
+0

이것은 오라클이 아니라고 가정하고 적어도 concat (', replace (', column_name, ',' '' '' '' ')') '로 변경 될 수 있습니다.'- 제 생각에는 - 그래서 – Ben

+0

OP는 이제 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 더 빠르고 깨끗한 버전입니다. –

관련 문제