从 SQL Server 中的所有列中删除引号

Posted

技术标签:

【中文标题】从 SQL Server 中的所有列中删除引号【英文标题】:Remove quotation marks from all columns in SQL Server 【发布时间】:2017-01-03 10:11:55 【问题描述】:

我有一个包含三列的表:A、B 和 C。

A ; B; C
"a1"; "b1"; "c1"
"a2"; "b2"; "c3"
"a3"; "b3"; "c3"

我需要删除表中所有行的引号。 In this post我找到了一个可行的解决方案,但需要指定所有列的名称:

UPDATE myTable
SET A  = REPLACE(A, '"', '');

UPDATE myTable
SET B  = REPLACE(B, '"', '');

UPDATE myTable
SET C  = REPLACE(C, '"', '');

问题:是否有更简洁的方法将替换应用到所有列?例如单行表达式?

谢谢

【问题讨论】:

答案是否定的。但是,如果只有一些行有这些引号,您可以添加 where a like '%"%' or b like ... 以减小事务大小(并避免触发操作,如果有的话。) 没有办法.. 【参考方案1】:

没有一个单行脚本,但是当我将数据放入 sql server 后,当我摆脱临时表中的所有双引号时,我的代码中有几行,请注意所有这些列是 varchar 数据类型。

--去掉数据中的双引号

Declare @ColName SYSNAME , @Sql Nvarchar(Max)


Declare Cur Cursor FOR 
SELECT c.name 
from sys.columns c inner join sys.tables t on c.object_id = t.object_id
Where t.name = 'myTable'   --<-- Your Table name

 OPEN Cur 

  FETCH NEXT FROM Cur INTO @ColName

WHILE @@FETCH_STATUS = 0 
BEGIN


      SET @SQL = 'UPDATE myTable
                    SET ' + QUOTENAME(@ColName) + ' = LTRIM(RTRIM(ISNULL(REPLACE(' + QUOTENAME(@ColName) + ' , ''"'' , '''') , '''')))'

      --PRINT @SQL 
      Exec sp_executesql @Sql 

      FETCH NEXT FROM Cur INTO @ColName
END
CLOSE Cur 
DEALLOCATE Cur
GO

【讨论】:

为每列编写一次替换会更容易,除非它们太多... @ZoharPeled 好吧,在某些情况下,我在每次上传中都有动态列数,范围从 30 到 150,这最适合我。 在这种情况下我必须同意,但我不太确定 OP 的情况是否相同。问题中没有任何迹象表明这种情况...... 感谢@M.Ali,感谢您的努力。事实上,它需要很多行,但我相信这不是 SQL 设计的。【参考方案2】:

如果记录数不大:-

    您可以script out the schema and data。 将双引号替换为FindReplace All。 运行清理后的脚本。

【讨论】:

【参考方案3】:

以下过程将在任何表中将任何单个字符替换为另一个单个字符:)

USE [TSQL2012]--your database name
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE dbo.replace_char 
@char_to_replace char(1), --character to be replaced
@expected_char char(1),
@table_name nvarchar(128) --your table name 
AS 
BEGIN

--Variable declaration
DECLARE @Column_Count_1 int 
DECLARE @SQLString AS NVARCHAR(4000)
DECLARE @count int=1
DECLARE @column_name nvarchar(128)

--Getting the count of column
SET @SQLString=N'select @Column_Count=count(*)  from  '+ @table_name
EXEC sp_executesql  @SQLString
, N'@Column_Count int OUTPUT'
, @Column_Count = @Column_Count_1 OUTPUT

--Getting the actual column names into a temporary table
select  c.name as name
into #temp_column_names
from sys.tables t
join sys.columns c
on t.object_id=c.object_id
where t.name=@table_name

--Looping through each column to replace the required character
WHILE (@count<=@Column_Count_1)
BEGIN
--setting the column name
SET @column_name=(select top 1 name from 
    (select Row_number()over (order by name) as r_n_n, name                  
    from #temp_column_names) aa 
    where r_n_n >=@count)

--updating the rows
SET @SQLString =N'Update '  + @table_name
SET @SQLString= @SQLString + N' Set ' + @column_name
SET @SQLString= @SQLString + N' = replace('  + @column_name
SET @SQLString =@SQLString + N',''' +@char_to_replace
SET @SQLString=@SQLString + N''',''' +@expected_char
SET @SQLString=@SQLString + N''');'

EXEC(@SQLString); 

SET @count=@count+1;
END

--Dropping the temp table
DROP TABLE #temp_column_names

END
GO

上述过程的执行

EXEC dbo.replace_char @char_to_replace, @expected_char, @table_name

你的情况

EXEC dbo.replace_char '"', '','Sample_1'

Sample_1 是我创建的表。

【讨论】:

以上是关于从 SQL Server 中的所有列中删除引号的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2000:如何只返回电话号码列中的号码

如何删除双引号并跳过 bcp 加载到 SQL Server 中的最后 3 行?

从 SQL Server 中的字符串中删除所有空格

如何从 SQL Server 中的同一列中查找多个最大值

如何从 SQL Server 存储过程中的 3 列中获取 MAX 值?

SQL Server,将列中的所有值与另一个值的一些值连接起来