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

Sql server Msg 8152字符串或二进制数据将被截断,sql-server,sql-insert,create-table,Sql Server,Sql Insert,Create Table,我知道以前有人问过这个问题,但没有一个答案能解决这个问题,需要另一双眼睛。我正在尝试创建一个表,并在其中添加一些值。我没有任何值约束,所以我不确定为什么会出现错误 CREATE TABLE [dbo].[AvailableTime] ( [Id] [INT] IDENTITY(1,1) NOT NULL, [TimeString] [NCHAR] NOT NULL, [TimeValue] [NCHAR] NOT NULL, [CompanyId] [INT] N

我知道以前有人问过这个问题,但没有一个答案能解决这个问题,需要另一双眼睛。我正在尝试创建一个表,并在其中添加一些值。我没有任何值约束,所以我不确定为什么会出现错误

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');

您需要在表中声明
CHAR
VARCHAR
字段的大小:

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

如果不指定明确的长度,则绝对不能指定
CHAR
VARCHAR
NCHAR
NVARCHAR
列(或变量或参数)

如果省略特定的长度,在某些情况下,变量或列的长度将恰好为一个字符!这通常不是你想要的

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

因此,请如下定义您的表:

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);