2015-09-25 30 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但做的工作。