【问题标题】:Replace function SQL替换函数 SQL
【发布时间】:2022-01-22 18:31:03
【问题描述】:

我有替换功能不起作用的问题

DECLARE @Tabela nvarchar(25)
DECLARE @query nvarchar(max)

SET @Tabela = '_#tmp_tt2_POS_racuni_'
SET @query = 'SELECT * INTO '+@Tabela+((replace(convert(varchar(10), getdate(),121),'''-''',''''))+'-'+(replace(convert(nvarchar(10),getdate(),108),''':''','''')))+'NP'+' FROM _tabels'

PRINT @query
SELECT * 
INTO _#tmp_tt2_POS_racuni_2021-12-21-11:15:27NP 
FROM _tabels 

Completion time: 2021-12-21T11:15:27.0724917+01:00 

【问题讨论】:

  • 一个名为_#tmp_tt2_POS_racuni_ 的表也不会像它的名字所暗示的那样是临时的临时表的名称必须以 has (#) 开头;你的以下划线开头 (_)。似乎(全部阅读?)您的表(对象)名称都可以。我希望不会。
  • 真正的问题是,当您可以使用内置功能处理数据时,为什么要制造这样的维护混乱?如果您甚至无法理解该字符串格式化函数的作用,那么您将面临更严重的问题
  • 您的REPLACE 功能正在运行,没有什么可替换的。样式121yyyy-mm-dd hh:mi:ss.mmm 的格式返回varchar,并且您想将值'-' 替换为''。您的字符串中没有 '-' 模式。你实际上应该只是用零长度字符串替换-
  • 虽然,为什么不使用样式112 (yyyymmdd);那么您不需要使用样式121 (yyyy-mm-dd hh:mi:ss.mmm) 的前10 个字符并删除连字符(-)。
  • @Nejc 你想要什么格式?直接生成你想要的格式比费力替换更容易

标签: sql sql-server


【解决方案1】:

你使用的引号太多了。

您正在使用replace(date,''':''','''')。这会将':' 替换为''。但是, getdate() 本身没有引号。我猜你这样做是因为你使用的是动态 sql - 但是对于日期,你应该省略引号:

replace(date,':','')

【讨论】:

  • 是的,这是解决方案。谢谢。
【解决方案2】:

您应该使用FORMAT 并直接指定您想要的格式,而不是通过中间格式。例如:

select format(getdate(),'yyyyMMddhhmmss')

产生20211221124017FORMAT 比 CONVERT 慢,但在这种情况下它只被调用一次。编写一个产生正确结果的可读查询更为重要。

也就是说,最好使用表分区而不是创建大量名称中带有日期的临时表。所有受支持的 SQL Server 版本和版本都支持分区,甚至是 LocalDB

【讨论】:

    【解决方案3】:

    首先,让我们进入 cmets 中详细讨论的真正问题;这是个糟糕的主意。

    您想为确切的时间点创建一个表这一事实非常强烈地感受到XY Problem。您要解决的真正问题是什么?您真正想要的很可能是分区表或时态表,以便您可以查询数据以获取准确的时间点。您需要哪个,我们不知道,但我建议您在这里重新考虑您的“解决方案”。


    至于问题,它完全按照预期工作。让我们看看你的REPLACE孤独:

    replace(convert(varchar(10), getdate(),121),'''-''','''')
    

    因此,在上面,您希望将'-'(用单引号括起来的连字符)替换为''(2 个单引号)。您想将连字符 (-) 替换为长度为零的字符串;那将是REPLACE(..., '-','')

    您使用的样式121 给出了yyyy-mm-dd hh:mi:ss.mmm 的格式,它不包含单引号('),所以难怪它找不到模式。

    虽然你在那个日期根本不需要REPLACE。您正在获取前 10 个字符或样式,然后删除连字符 (-) 以获取 yyyyMMdd,但已经有一个样式;风格112

    以上可以改写为:

    DECLARE @Tabela sysname;
    DECLARE @query nvarchar(max);
    SET @Tabela = N'_#tmp_tt2_POS_racuni_';
    SET @query = N'SELECT * INTO dbo.'+QUOTENAME(CONCAT(@Tabela,CONVERT(nvarchar(8),GETDATE(),112),,N'-'.REPLACE(CONVERT(nvarchar(10),GETDATE(),108),':',''),N'',N'NP')+N' FROM dbo._tabels;'
    PRINT @query;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多