Sql 在insert语句出错时捕获fieldname

Sql 在insert语句出错时捕获fieldname,sql,sql-server,tsql,Sql,Sql Server,Tsql,是否有方法获取SQL 2014中insert发生错误的字段的名称。我正在插入30多个字段,并且浪费了数小时试图找出错误发生的位置。似乎是一个简单的调试功能,但我返回的错误是 Msg 8114,第16级,第5状态,第2行 将数据类型nvarchar转换为数字时出错 我检查了insert表中的每个数字列,并尝试将相应的数据转换为正确的数据类型,但找不到问题 INSERT INTO [dbo].[Employee] ( [EmployeeID] ,[Firs

是否有方法获取SQL 2014中insert发生错误的字段的名称。我正在插入30多个字段,并且浪费了数小时试图找出错误发生的位置。似乎是一个简单的调试功能,但我返回的错误是

Msg 8114,第16级,第5状态,第2行

将数据类型nvarchar转换为数字时出错

我检查了insert表中的每个数字列,并尝试将相应的数据转换为正确的数据类型,但找不到问题

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$]

最好的解决方法是用ISNumeric函数检查字段

或者,如果您正在插入,请尝试使用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,
      ...
然后在表中搜索-999


我知道这并不容易,但要做好这项工作。

这可能是sql server最恼人的错误。多年来一直存在连接问题来解决此问题。我无法理解为什么他们不能简单地将有问题的列名添加到错误中。很明显,它在发生时可用于发动机。这很像数据将被截断错误,没有列名。Insert语句addedI正在考虑对其运行SQl事件探查器,但我不知道这是否会得到该字段名。
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,
      ...