加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server多个REPLACE与#temp表

发布时间:2020-12-12 08:29:39 所属栏目:MsSql教程 来源:网络整理
导读:我试图在SQL Server查询中重写多个字符,并希望通过#temp表而不是嵌套的REPLACE来实现.我下面有SQL代码,希望实现结果 ABC DEF GHI IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #tempIF OBJECT_ID('tempdb..#temp2') IS NOT NULL DROP TABLE #temp2C
我试图在SQL Server查询中重写多个字符,并希望通过#temp表而不是嵌套的REPLACE来实现.我下面有SQL代码,希望实现结果

ABC
DEF
GHI

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
IF OBJECT_ID('tempdb..#temp2') IS NOT NULL DROP TABLE #temp2

CREATE TABLE #temp
(
    STRING_TO_REPLACE NVARCHAR(5)
)
INSERT INTO #temp (STRING_TO_REPLACE)
VALUES            (' '),('/'),('_') 

CREATE TABLE #temp2
(
    STRING_NAME NVARCHAR(5)
)

INSERT INTO #temp2 (STRING_NAME)
VALUES            ('A BC'),('D/EF'),('G_HI')

SELECT REPLACE(t2.STRING_NAME,(SELECT t1.STRING_TO_REPLACE   
                               FROM #temp t1),'') 
 FROM #temp2 t2

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
IF OBJECT_ID('tempdb..#temp2') IS NOT NULL DROP TABLE #temp2

我可以通过嵌套替换来实现结果

SELECT REPLACE(REPLACE(REPLACE(t2.STRING_NAME,'_',''),'/',' ','')  FROM #temp2 t2

但真的很想通过#temp表来做到这一点.请有人帮助我这个.
当我尝试运行我的第一个代码,我得到以下错误

Msg 512,Level 16,State 1,Line 23 Subquery returned more than 1
value. This is not permitted when the subquery follows =,!=,<,<=,

,>= or when the subquery is used as an expression.

解决方法

这是使用CROSS APPLY的一种方法
SELECT result 
FROM   #temp2 t2 
       CROSS apply (SELECT Replace(string_name,t1.string_to_replace,'') AS 
                           result 
                    FROM   #temp t1) cs 
WHERE  result <> string_name

结果:

result
-----
ABC
DEF
GHI

注意:只有每个string_name只有一个string_to_replace,这将是有效的

更新:在单个string_name中处理多个string_to_replace,这里使用Dynamic sql的一种方法

我通过向循环添加一个identity属性对#temp表进行了一个小的更改

IF Object_id('tempdb..#temp') IS NOT NULL 
  DROP TABLE #temp 

IF Object_id('tempdb..#temp2') IS NOT NULL 
  DROP TABLE #temp2 

CREATE TABLE #temp 
  ( 
     id                INT IDENTITY(1,1),string_to_replace NVARCHAR(5) 
  ) 

INSERT INTO #temp 
            (string_to_replace) 
VALUES      (' '),('_') 

CREATE TABLE #temp2 
  ( 
     string_name NVARCHAR(5) 
  ) 

INSERT INTO #temp2 
            (string_name) 
VALUES      ('A BC'),('G_HI'),('A BD_') 

DECLARE @col_list          VARCHAR(8000)= '',@sql               VARCHAR(max),@cntr              INT,@inr               INT =1,@STRING_TO_REPLACE NVARCHAR(5) 

SELECT @cntr = Max(id) 
FROM   #temp 

SET @sql = 'select ' 

WHILE @inr < = @cntr 
  BEGIN 
      SELECT @STRING_TO_REPLACE = string_to_replace 
      FROM   #temp 
      WHERE  id = @inr 

      IF @inr = 1 
        SET @col_list = 'replace (STRING_NAME,''' 
                        + @STRING_TO_REPLACE + ''','''')' 
      ELSE 
        SET @col_list = 'replace (' + @col_list + ','''')' 

      SET @inr+=1 
  END 

SET @sql += ' from #temp2' 
--print @col_list 
SET @sql = 'select ' + @col_list + ' as Result from #temp2' 

--print @sql 
EXEC (@sql)

结果:

Result
------
ABC
DEF
GHI
ABD

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读