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