【问题标题】:Error converting data type varchar to bigint in stored procedure在存储过程中将数据类型 varchar 转换为 bigint 时出错
【发布时间】:2014-10-04 18:53:53
【问题描述】:

我正在尝试使用usp_TimesheetsAuditsLoadAllbyId 42747, NULL 命令调用此过程。

但我总是出错

消息 8114,级别 16,状态 5,过程 usp_TimesheetsAuditsLoadAllById,第 9 行
将数据类型 varchar 转换为 bigint 时出错。

TimesheetsAudits 表的IDbigint 类型。我尝试了几种类型的转换和强制转换,但我现在真的被卡住了。

希望有人可以提供帮助。谢谢

ALTER PROCEDURE [dbo].[usp_TimesheetsAuditsLoadAllById]
(
    @Id INT,
    @StartDate DATETIME
)
AS
BEGIN
   SET NOCOUNT ON

   SELECT TOP 51 * 
   FROM 
      (SELECT TOP 51 
          ID,
          Type, 
          ReferrerId,
          CAST(Description AS VARCHAR(MAX)) AS Description,
          OnBehalfOf,
          Creator,
          DateCreated 
       FROM 
          TimesheetsAudits 
       WHERE 
          (ReferrerID = @Id) AND
          (@StartDate IS NULL OR DateCreated < @StartDate)
       ORDER BY
          DateCreated DESC

       UNION

       SELECT TOP 51 
          tia.ID,
          tia.Type, 
          tia.ReferrerId,
          '[Day: ' + CAST(DayNr AS VARCHAR(5)) + '] ' + CAST(tia.Description AS VARCHAR(MAX)) AS Description,
          tia.OnBehalfOf,
          tia.Creator,
          tia.DateCreated 
       FROM 
          TimesheetItemsAudits tia
       INNER JOIN 
          TimesheetItems ti ON tia.ReferrerId = ti.ID
       WHERE 
          (ti.TimesheetID = @Id) AND
          (@StartDate IS NULL OR tia.DateCreated < @StartDate)
       ORDER BY 
          tia.DateCreated DESC) t
   ORDER BY 
       t.DateCreated DESC
END

来自 cmets 的表的表定义:

CREATE TABLE [dbo].[TimesheetsAudits]( 
  [ID] [bigint] IDENTITY(1,1) NOT NULL, 
  [Type] [tinyint] NOT NULL, 
  [ReferrerId] [varchar](15) NOT NULL, 
  [Description] [text] NULL, 
  [OnBehalfOf] [varchar](10) NULL, 
  [Creator] [varchar](10) NOT NULL, 
  [DateCreated] [datetime] NOT NULL
)



CREATE TABLE [dbo].[TimesheetItemsAudits]( 
  [ID] [bigint] IDENTITY(1,1) NOT NULL, 
  [Type] [tinyint] NOT NULL, 
  [ReferrerId] [varchar](15) NOT NULL, 
  [Description] [text] NULL, 
  [OnBehalfOf] [varchar](10) NULL, 
  [Creator] [varchar](10) NOT NULL, 
  [DateCreated] [datetime] NOT NULL
)

【问题讨论】:

  • TimesheetAudits 的表结构?
  • referrerId 是什么类型的描述?
  • TimesheetItemsAudits 的表格描述也会有所帮助。两个表的 ID 都是 bigint 吗?
  • CREATE TABLE [dbo].[TimesheetsAudits]( [ID] [bigint] IDENTITY(1,1) NOT NULL, [Type] [tinyint] NOT NULL, [ReferrerId] [varchar](15 ) NOT NULL, [Description] [text] NULL, [OnBehalfOf] [varchar](10) NULL, [Creator] [varchar](10) NOT NULL, [DateCreated] [datetime] NOT NULL,
  • CREATE TABLE [dbo].[TimesheetItemsAudits]( [ID] [bigint] IDENTITY(1,1) NOT NULL, [Type] [tinyint] NOT NULL, [ReferrerId] [varchar](15 ) NOT NULL, [Description] [text] NULL, [OnBehalfOf] [varchar](10) NULL, [Creator] [varchar](10) NOT NULL, [DateCreated] [datetime] NOT NULL,

标签: sql sql-server tsql bigint


【解决方案1】:

您执行 [dbo].[TimesheetsAudits] 和 TimesheetItems ti ON tia.ReferrerId = ti.ID 的 INNER JOIN

tia.[ReferrerId] 是 varchar,ti.[ID] 是 [bigint]。

我希望 tia.[ReferrerId] 中的值不能转换为 bigint。

尝试以下方法:

SELECT [ReferrerId] FROM TimesheetItemsAudits WHERE ISNUMERIC(ReferrerId) = 0

这可以帮助您找到“违规行”。

【讨论】:

  • 对其他谷歌用户的提醒:小心使用 ISNUMERIC(),因为它也会在科学记数法和一些货币符号上验证为真。更多信息在这里:msdn.microsoft.com/en-us/library/ms186272.aspx。在您必须处理这些元素的情况下,您可以使用 TRY_CAST()(在 SQL 2012 中引入)来检查您的转换。
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多