2015-12-03 411 views
0

我真的不知道爲什麼我收到此錯誤,因爲如果表不存在我創建它,它不應該進入此片的查詢如果表存在,那麼爲什麼它會再次進入並嘗試進行轉換?T-SQL錯誤:參數數據類型datetime對於子字符串函數的參數1無效

這是整個代碼:

Use test 
GO 
    IF OBJECT_ID('MetricsServerAudit') IS NOT NULL 
     BEGIN 
      CREATE TABLE #TEMP ([TIME] nvarchar(max) NULL,[DATE] nvarchar(max) NULL,[USER_LOGIN] nvarchar(max) NULL,[USER_NAME] nvarchar(max) NULL,[MODEL_NAME] nvarchar(max) NULL,[SCORECARD_IDENTIFIER] nvarchar(max) NULL, [SCORECARD_NAME] nvarchar(max) NULL,[ELEMENT_IDENTIFIER] nvarchar(max) NULL,[ELEMENT_NAME] nvarchar(max) NULL,[SERIES_IDENTIFIER] nvarchar(max) NULL,[SERIES_NAME] nvarchar(max) NULL,[PERIOD_NAME] nvarchar(max) NULL,[ACTION_TYPE] nvarchar(max) NULL,[ACTION] nvarchar(max) NULL,[PREVIOUS_VALUE] nvarchar(max) NULL,[VALUE] nvarchar(max) NULL,[UNIT] nvarchar(max) NULL) 

        BULK INSERT #TEMP FROM 'C:\QPR_Logs\Audit\MetricsServerAudit.txt' 
        WITH (FIELDTERMINATOR ='\t', ROWTERMINATOR = '\r', FIRSTROW = 2, KEEPNULLS) 

        UPDATE #TEMP SET [DATE]= REPLACE(CONVERT(VARCHAR(11),[DATE],103),'/' ,'-') 
        ALTER TABLE #TEMP ALTER COLUMN [DATE] DATE 
        UPDATE #TEMP SET [TIME] = '12:00:00' Where [TIME] = '' 
        UPDATE #TEMP SET [TIME] = REPLACE(REPLACE(REPLACE([TIME], CHAR(10), ''), CHAR(13), ''), CHAR(9), '') 
        UPDATE #TEMP SET [TIME] = REPLACE([TIME], '/', ':') 
        UPDATE #TEMP SET [TIME] = left([TIME], 8) 
        UPDATE #TEMP SET [DATE] = '2015-01-01' Where [DATE] is null 


        INSERT INTO [dbo].[MetricsServerAudit]([DateStamp],[TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT]) 
        SELECT CONCAT([DATE],'', [TIME]) AS [DateStamp], [TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT] 
        FROM #TEMP 
        WHERE NOT EXISTS(SELECT [TIME] FROM [dbo].[MetricsServerAudit] WHERE [TIME] = [TIME]) 
        DROP TABLE #TEMP 
     END 

GO --SEPERATOR 
    IF (OBJECT_ID('MetricsServerAudit') IS NULL and OBJECT_ID('tempdb..#TEMP') IS NULL) 
     BEGIN 
      CREATE TABLE MetricsServerAudit ([DateStamp] nvarchar(max) NULL, [TIME] nvarchar(max) NULL,[DATE] date NULL,[USER_LOGIN] nvarchar(max) NULL,[USER_NAME] nvarchar(max) NULL,[MODEL_NAME] nvarchar(max) NULL,[SCORECARD_IDENTIFIER] nvarchar(max) NULL,[SCORECARD_NAME] nvarchar(max) NULL,[ELEMENT_IDENTIFIER] nvarchar(max) NULL,[ELEMENT_NAME] nvarchar(max) NULL,[SERIES_IDENTIFIER] nvarchar(max) NULL,[SERIES_NAME] nvarchar(max) NULL,[PERIOD_NAME] nvarchar(max) NULL,[ACTION_TYPE] nvarchar(max) NULL,[ACTION] nvarchar(max) NULL,[PREVIOUS_VALUE] nvarchar(max) NULL,[VALUE] nvarchar(max) NULL,[UNIT] nvarchar(max) NULL) 
      CREATE TABLE #TEMP ([TIME] nvarchar(max) NULL,[DATE] nvarchar(max) NULL,[USER_LOGIN] nvarchar(max) NULL,[USER_NAME] nvarchar(max) NULL,[MODEL_NAME] nvarchar(max) NULL,[SCORECARD_IDENTIFIER] nvarchar(max) NULL, [SCORECARD_NAME] nvarchar(max) NULL,[ELEMENT_IDENTIFIER] nvarchar(max) NULL,[ELEMENT_NAME] nvarchar(max) NULL,[SERIES_IDENTIFIER] nvarchar(max) NULL,[SERIES_NAME] nvarchar(max) NULL,[PERIOD_NAME] nvarchar(max) NULL,[ACTION_TYPE] nvarchar(max) NULL,[ACTION] nvarchar(max) NULL,[PREVIOUS_VALUE] nvarchar(max) NULL,[VALUE] nvarchar(max) NULL,[UNIT] nvarchar(max) NULL) 

        BULK INSERT #TEMP FROM 'C:\QPR_Logs\Audit\MetricsServerAudit.txt' 
        WITH (FIELDTERMINATOR ='\t', ROWTERMINATOR = '\r', FIRSTROW = 2, KEEPNULLS) 

        UPDATE #TEMP SET [DATE]= REPLACE(CONVERT(VARCHAR(11),[DATE],103),'/' ,'-') 
        ALTER TABLE #TEMP ALTER COLUMN [DATE] DATE 
        UPDATE #TEMP SET [TIME] = '12:00:00' Where [TIME] = '' 
        UPDATE #TEMP SET [TIME] = REPLACE(REPLACE(REPLACE([TIME], CHAR(10), ''), CHAR(13), ''), CHAR(9), '') 
        UPDATE #TEMP SET [TIME] = REPLACE([TIME], '/', ':') 
        UPDATE #TEMP SET [TIME] = left([TIME], 8) 
        UPDATE #TEMP SET [DATE] = '2015-01-01' Where [DATE] is null     


        INSERT INTO [dbo].[MetricsServerAudit]([DateStamp],[TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT]) 
        SELECT CONCAT([DATE],'', [TIME]) AS [DateStamp],[TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT] 
        FROM #TEMP 
        DROP TABLE #TEMP 

        IF (NOT EXISTS(select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = '[DateStamp]' AND DATA_TYPE = 'DATETIME' AND TABLE_NAME = 'MetricsServerAudit')) 
          BEGIN 
           UPDATE [dbo].[MetricsServerAudit] SET [DateStamp] = CONVERT(DATETIME,(SUBSTRING([DateStamp],1,10)+' '+SUBSTRING([DateStamp],11,15))) 
           ALTER TABLE [dbo].[MetricsServerAudit] ALTER COLUMN [DateStamp] DATETIME 
          END 
     END 

這是一塊在錯誤出現:

UPDATE [dbo].[MetricsServerAudit] SET [DateStamp] = CONVERT(DATETIME,(SUBSTRING([DateStamp],1,10)+' '+SUBSTRING([DateStamp],11,15))) 

它在整個代碼第四屆最後一行。

這是完全錯誤:

Msg 8116, Level 16, State 1, Line 51
Argument data type datetime is invalid for argument 1 of substring function.

誰能告訴我它爲什麼這個問題以及如何解決它?

+1

而'[DateStamp]'不是'datetime'類型?錯誤似乎很簡單 –

回答

1

這是一個編譯錯誤。如果MetricsServerAudit.DateStamp存在並且是日期時間,則此代碼不會編譯,因爲substring不允許將datetime作爲其第一個參數。您的選項是:

  1. 將這個代碼放到一個存儲過程,它只是一次編譯或
  2. 添加另一個轉換,讓你永遠只傳遞一個VARCHAR到字符串,如:CONVERT(DATETIME, SUBSTRING(CONVERT(VARCHAR, [DateStamp])..
相關問題