Sql 在每列上选择“替换”
我有一个包含大约100列的表,是否可以同时对每一列执行Select Replace而不是单独键入每一列,我正在尝试修剪表中每个字段的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' 然后,您可以使用游标在每个列名上迭代,构建一些动
“
”
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)