2015-09-25 33 views
0

是否有方法可以獲取在SQL 2014中的插入時發生錯誤的字段的名稱。我插入了30多個字段並浪費了數小時,試圖找出錯誤的位置正在發生。似乎是一個簡單的調試功能,但我回來的錯誤是在插入語句時捕獲錯誤的字段名稱

消息8114,級別16,狀態5,2號線

錯誤轉換數據類型爲nvarchar到數字。

我已經通過插入表中的每個數字列,並嘗試將相應的數據轉換爲正確的數據類型,並找不到問題。

INSERT INTO [dbo].[Employee] 
     (
     [EmployeeID] 
     ,[FirstName] 
     ,[LastName] 
     ,[ManagerID] 
     ,[CurrencyCode] 
     ,[CountryCode] 
     ,[JobTitle] 
     ,[Grade] 
     ,[IsPlanningEligible] -- BIT 
     ,[HireDate] 
     ,[LastSalaryReviewDate] 
     ,[AnnualSalaryAmt] -- Money 
     ,[AnnualSalaryRangeMinAmt] --'NUMERIC' 
     ,[AnnualSalaryRangeMidAmt] --'NUMERIC' 
     ,[AnnualSalaryRangeMaxAmt] --'NUMERIC' 
     ,[PositionInSalaryRange] 
     ,[MeritIsEligible] -- BIT 
     ,[MeritIsLocked] -- BIT 
     ,[MeritBudgetKey] 
     ,[LegacyCompany] 
     ,[FTEPct] --'NUMERIC'  
     ,[PreviousYearPerformance] 
     ,[LastIncreasePct] --'NUMERIC' 
     ,[LastIncreaseReason] 
     ,[Location] 
     ,[CostCenter] 
     ,[ManagerName] 
     ,[MeritEffectiveDateByCountry] 
     ,[HRBPPersonnelNumber] 
     ,[HRBPName] 
     ,[HREmployee] 
     ,[LocalPersonnelNumber] 
     ,[EmailAddress] 
     ,[OrgLevel1] 
     ,[OrgLevel2] 
     ,[OrgLevel3] 
     ,[OrgLevel4] 
     ,[OrgLevel5] 
     ,[OrgLevel6]   
    ) 


/*** IGT STAGING SELECT ***/ 

    SELECT LTRIM(Str([Personnel Number], 25, 0)) 
    ,[Preferred First Name] 
    ,[Last Name] 
    ,CAST([Manager Personnel Number] AS NVARCHAR(50)) 
    ,[Currency] 
    ,[Country] 
    ,[Job Title] 
    ,[Grade] 
    ,CAST([Planning Eligible] AS BIT) 
    ,[Date of Hire] 
    ,[Last Increase Date] 
    ,[Annual Base Salary_(as of mm/dd/yyyy) ] 
    ,[Minimum of Range] 
    ,[Midpoint of Range] 
    ,[Maximum of Range] 
    ,CAST([Position in Range] AS NVARCHAR(50)) 
    ,[Merit Eligible ] 
    ,[MeritLocked] 
    ,[Merit Budget %] 
    /*IGT Custom Fields */ 
    ,[Legacy Company] 
    ,[FTE %] 
    ,[Previous Year's Performance] 
    ,[Last Increase (%)] 
    ,[Last Increase Reason] 
    ,[Location] 
    , CAST([Cost Center] AS NVARCHAR(50)) 
    ,[Manager Name] 
    ,[Merit Effective Date (by Country)] 
    ,CAST([HRBP Personnel Number] AS NVARCHAR(50)) 
    ,[HRBP Name] 
    ,[HR Employee (yes/no)]   
    ,[Local Personnel Number] 
    ,[Email Address] 
    ,[Org Level 1] 
    ,[Org Level 2] 
    ,[Org Level 3] 
    ,[Org Level 4] 
    ,[Org Level 5] 
    ,[Org Level 6] 

    FROM [IGT_Compensation].[dbo].[IGT_Staging$] 
+1

這可能是來自sql server最煩人的錯誤。多年來一直存在連接問題來解決這個問題。爲什麼他們不能簡單地將錯誤的列名添加到錯誤中,這是我無法想象的。很顯然,發動機在發生故障時可以使用它。這非常類似於沒有列名稱的「數據將被截斷」錯誤。 –

+0

添加插入語句 –

+0

我正在考慮運行SQl Profiler反對它,但我不知道如果這甚至讓我那個字段名。 –

回答

0

解決的最好方法是使用ISNumeric功能

SELECT ID, field1, field2 .., fieldN 
FROM yourTable 
WHERE 
    ISNUMERIC(field1) = 0 
OR ISNUMERIC(field2) = 0 
... 
OR ISNUMERIC(fieldN) = 0 

或者如果你是在INSERT嘗試使用CASE並將其更改爲默認值,檢查你的領域。

INSERT INTO YourTable 
Values (
     CASE 
      WHEN ISNUMERIC(field1) = 0 THEN -999 
      ELSE CAST (field1 as numeric) 
     END as field1, 
     CASE 
      WHEN ISNUMERIC(field2) = 0 THEN -999 
      ELSE CAST (field2 as numeric) 
     END as field2, 
     ... 

,然後搜索YourTable-999

我知道是不是preaty但做的工作。