Msg 8152 字符串或二进制数据将被截断

Msg 8152 String or binary data would be truncated

我知道之前有人问过这个问题,但是 none 的答案正在解决这个问题,需要另一双眼睛。我正在尝试创建一个 table 并为其添加一些值。我没有任何价值限制,所以我不确定为什么会收到我收到的错误。

CREATE TABLE [dbo].[AvailableTime]
(
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [TimeString] [NCHAR] NOT NULL,
    [TimeValue] [NCHAR] NOT NULL,
    [CompanyId] [INT] NOT NULL,
    [CompanyName] [NVARCHAR](MAX) NULL,
    [LocationId] [INT] NOT NULL,
    [LocationName] [NVARCHAR] NOT NULL,
    [IsClaimed] [BIT] NOT NULL,

    CONSTRAINT [PK_AvailableTime] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

INSERT INTO dbo.AvailableTime (TimeString, TimeValue, CompanyId, CompanyName, 
                               LocationId, LocationName, IsClaimed) 
VALUES ('2019-01-07T00:00:00', '12:00 AM', 1, 'Company', 
        2, 'Inver Grove', 'FALSE');

您需要在 table 中声明 CHARVARCHAR 字段的大小:

CREATE TABLE [dbo].[AvailableTime]
(
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [TimeString] [NCHAR](50)  NOT NULL,
    [TimeValue] [NCHAR](50)  NOT NULL,
    [CompanyId] [INT] NOT NULL,
    [CompanyName] [NVARCHAR](MAX) NULL,
    [LocationId] [INT] NOT NULL,
    [LocationName] [NVARCHAR](50) NOT NULL,
    [IsClaimed] [BIT] NOT NULL,

    CONSTRAINT [PK_AvailableTime] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

您永远不应指定 CHARVARCHARNCHARNVARCHAR 列(或变量或参数)而没有 指定显式 length!

如果省略特定长度,在某些情况下,您最终会得到 正好一个字符 长度的变量或列!这通常不是您想要的!

另外: 为什么要将 TimeStringTimeValue 存储为 NCHAR?没有任何意义 - 使用 最合适的 数据类型 - 在这里,这将是 DATETIME2(n)TIME.

所以像这样定义你的 table:

CREATE TABLE [dbo].[AvailableTime]
(
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [TimeString] DATETIM2(0) NOT NULL,
    [TimeValue] TIME(0) NOT NULL,
    [CompanyId] [INT] NOT NULL,
    [CompanyName] [NVARCHAR](MAX) NULL,
    [LocationId] [INT] NOT NULL,
    [LocationName] [NVARCHAR](100) NOT NULL,
    [IsClaimed] [BIT] NOT NULL,

你应该没事的。

您在插入查询时出错,最后一列中的类型不匹配。

INSERT INTO dbo.AvailableTime (TimeString, TimeValue, CompanyId, CompanyName, 
    LocationId, LocationName, IsClaimed)
  VALUES ('2019-01-07T00:00:00', '12:00 AM', 1, 'Company', 2, 'Inver Grove', 0);