나는 약 100 개의 열을 포함하는 테이블을 가지고 있습니다. 각 열을 개별적으로 입력하지 않고 동시에 모든 열의 선택 바꾸기를 수행 할 수 있습니까? '"'
을 다듬 으려고합니다. 테이블의 각 필드. SQL Server를 사용하고 있기 때문에모든 열의 SELECT REPLACE
SELECT
REPLACE(*, '"', '')
나는 약 100 개의 열을 포함하는 테이블을 가지고 있습니다. 각 열을 개별적으로 입력하지 않고 동시에 모든 열의 선택 바꾸기를 수행 할 수 있습니까? '"'
을 다듬 으려고합니다. 테이블의 각 필드. SQL Server를 사용하고 있기 때문에모든 열의 SELECT REPLACE
SELECT
REPLACE(*, '"', '')
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)
, 당신은 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
이것은 오라클이 아니라고 가정하고 적어도 concat (', replace (', column_name, ',' '' '' '' ')') '로 변경 될 수 있습니다.'- 제 생각에는 - 그래서 – Ben
OP는 이제 SQL Server에서 ... concat()를 SQL Server라고 했습니까 –
재귀 버전 :
여기 내 솔루션입니다
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)
그냥 또 다른 가능한 방법을 제공하기 위해 이것을 게시하겠다고 생각했지만, @ t-clausen.dk 더 빠르고 깨끗한 버전입니다. –
이 무엇 RDBMS입니까? –
따옴표를 사용하지 않고 각 레코드를 따옴표로 선택하거나 * 업데이트 * 각 레코드에 * 선택 하시겠습니까? –
MS SQL Server 2008. 따옴표없이 각 레코드를 선택하고 싶습니다. – AzaRoth91