Sql-Server
在動態 SQL 上轉換為日期時間失敗 - “從字元串轉換日期和/或時間時轉換失敗”
我已經花了幾個小時來處理它,但仍然無法讓它工作。我正在嘗試獲取與動態 SQL 查詢的模式匹配的最新文件的路徑,其中我將 CSV 文件載入到儲存過程的臨時表中。我在其上建構動態查詢的原始 SQL 工作得非常好(是的,我知道 CONCAT 不在這個中,但它不應該有所作為):
DECLARE @FILE varchar(MAX) SET @FILE = '%InventoryFeedResults%.csv'; DECLARE @FILES TABLE (ID int IDENTITY, [FileInfo] varchar(MAX)) INSERT INTO @FILES EXECUTE xp_cmdshell 'dir "C:\Inventory Feeds"' SELECT [FileName] FROM (SELECT ID ,CAST(LEFT([FileInfo],18) AS datetime) AS 'Created' ,RIGHT([FileInfo],CHARINDEX(CHAR(32), REVERSE([FileInfo]),1)-1) AS 'FileName' ,ROW_NUMBER() OVER(ORDER BY CONVERT(datetime,LEFT([FileInfo],18)) DESC) AS 'RowNum' FROM @FILES WHERE [FileInfo] LIKE @FILE) AS FileInfo WHERE FileInfo.RowNum = 1
但是當我嘗試在這裡執行它時,我得到“從字元串轉換日期和/或時間時轉換失敗”錯誤:
DECLARE @DIR varchar(MAX) SET @DIR = 'C:\Inventory Feeds\'; DECLARE @FILE varchar(MAX) SET @FILE = '%InventoryFeedResults%.csv'; DECLARE @FINDFEED nvarchar(MAX), @PARAM nvarchar(MAX), @PATH nvarchar(MAX) SELECT @FINDFEED = 'DECLARE @FILES TABLE (ID int IDENTITY, [FileInfo] varchar(MAX)) INSERT INTO @FILES EXECUTE xp_cmdshell ''dir "'+ @DIR + '" /b'' SELECT @ADD = CONCAT(''' + @DIR + ''',[FileName]) FROM (SELECT ID ,CAST(LEFT([FileInfo],18) AS datetime) AS ''Created'' ,RIGHT([FileInfo],CHARINDEX(CHAR(32), REVERSE([FileInfo]),1)-1) AS ''FileName'' ,ROW_NUMBER() OVER(ORDER BY CONVERT(datetime,LEFT([FileInfo],18)) DESC) AS ''RowNum'' FROM @FILES WHERE [FileInfo] LIKE ''' + @FILE + ''') AS FileInfo WHERE FileInfo.RowNum = 1' SELECT @PARAM = '@ADD nvarchar(500) OUTPUT' EXECUTE sp_executesql @FINDFEED, @PARAM, @ADD = @PATH OUTPUT SELECT @PATH
日期是這種格式的 nvarchars,例如:‘2019-02-15 10:29:00.000’
文件名採用報告名稱和 3 位數字格式,例如:InventoryFeedResults924.csv
的完整輸出
FileInfo
是:02/15/2019 10:29 AM 405,609 InventoryFeedResults924.csv
這需要在 SQL Server 12 上工作。
我已經嘗試在 CAST 和 CONVERT 以及 CONVERT 中的一些不同樣式編號之間切換,但老實說,我不確定為什麼它會在一個地方而不是另一個地方工作。我只需要知道什麼神奇的咒語可以讓我在動態查詢中將此字元串轉換為日期時間,這樣我就可以在可能的情況下提取最新的文件。或者也許我可以向 xp_cmdshell 添加一個選項來格式化時間戳以使其工作?我很茫然,請幫助我,網際網路!
您的第二個範例是使用
/b
僅返回文件名但不返回任何日期資訊的開關。刪除/b
應該可以解決問題。