从 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。
将双引号替换为
Find
和Replace 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 行?