我有替換功能不起作用的問題
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
uj5u.com熱心網友回復:
您使用的引號太多了。
您正在使用replace(date,''':''',''''). 這將替換':'為''. 但是, getdate() 本身沒有引號。我猜你這樣做是因為你正在使用動態 sql - 但是對于日期,你應該省略引號:
replace(date,':','')
uj5u.com熱心網友回復:
您應該FORMAT直接使用和指定您想要的格式,而不是通過中間格式。例如 :
select format(getdate(),'yyyyMMddhhmmss')
產生20211221124017. FORMAT比 CONVERT 慢,但在這種情況下它只被呼叫一次。撰寫一個能產生正確結果的可讀查詢要重要得多。
也就是說,最好使用表磁區而不是創建許多名稱中帶有日期的臨時表。所有支持的 SQL Server 版本和版本都支持磁區,甚至是 LocalDB
uj5u.com熱心網友回復:
首先,讓我們進入評論中詳細討論的實際問題;這是一個可怕的想法。
您想要為一個確切的時間點創建一個表這一事實非常具有XY 問題的味道。你試圖用這個解決的真正問題是什么?很可能您真正想要的是磁區表或時態表,以便您可以查詢確切時間點的資料。您需要什么,我們不知道,但我建議您在這里重新考慮您的“解決方案”。
至于問題,它完全按預期作業。讓我們看看你REPLACE的孤獨:
replace(convert(varchar(10), getdate(),121),'''-''','''')
所以,在上面,你想'-'用''(2個單引號)替換(用單引號括起來的連字符)。您不想-用零長度字串替換連字符 ( );那將是REPLACE(..., '-','')。
您使用的樣式121給出了 format 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389541.html
標籤:sql sql-server
上一篇:當月和年在不同列時,SQLServer查詢過濾財政年度
下一篇:如何使用LIMIT獲取行的總和
