代码之家  ›  专栏  ›  技术社区  ›  Tristan Goers

在将记录插入表时,将nvarchar值转换为数据类型int时转换失败

  •  0
  • Tristan Goers  · 技术社区  · 1 年前

    我正在使用脚本每天自动更新数据库,以将Azure Blob存储与可查询的Azure SQL Server数据库同步。在删除和更新记录时,我将插入符合特定条件的全新记录。以下是我目前正在使用的插入语句。

    第一条记录被毫无问题地插入到数据库中,但是,第二条记录会抛出错误:

    将nvarchar值“〔{“日期”:“2019-06-17”}、{“索引”:“2”}、}“PAN”:“987”}、{“阶段”:“构造”}、<“主要”:“False”}、=“项目ID”:“3484”}转换为int数据类型时,转换失败。

    这个专栏 nvarchar 引用被定义为 nvarchar(MAX) ,不是 int .

    数据库架构: https://gyazo.com/b95367d03e71b6f1138111668bf56e05

    创建表。。。

    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [BlobSync].[BlobInventory]
    (
        [ID] [bigint] IDENTITY(1,1) NOT NULL,
        [AccountName] [nvarchar](max) NOT NULL,
        [Name] [nvarchar](max) NOT NULL,
        [CreationTime] [datetime] NOT NULL,
        [LastModified] [datetime] NOT NULL,
        [Etag] [nvarchar](max) NULL,
        [ContentLength] [bigint] NULL,
        [ContentType] [nvarchar](max) NULL,
        [ContentEncoding] [nvarchar](max) NULL,
        [ContentLanguage] [nvarchar](max) NULL,
        [BlobType] [nvarchar](max) NULL,
        [AccessTier] [nvarchar](max) NULL,
        [Metadata] [nvarchar](max) NULL,
        [Deleted] [bit] NULL,
        [RemainingRetentionDays] [int] NULL,
        [TagCount] [int] NULL,
        [Tags] [nvarchar](max) NULL,
        [LastUpdatedUTC] [datetime] NULL,
    
        CONSTRAINT [PK_BlobInventory] 
            PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
                          OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    DROP TABLE IF EXISTS #TempTableInsert; 
    
    SELECT * 
    INTO #TempTableInsert 
    FROM [BlobSync].[BlobInventory] 
    WHERE [ID] < 0; 
    
    INSERT INTO #TempTableInsert (AccountName, Name, CreationTime, LastModified, Etag, ContentLength, ContentType, ContentEncoding, ContentLanguage, BlobType, AccessTier, Metadata, Deleted, RemainingRetentionDays, Tags, TagCount, LastUpdatedUTC) 
    VALUES 
    (
    'blobstoragename'
    , 'project-images/bdb70f3e-8d8b-41f1-b357-66e1792280e9'
    , '7/22/2024 2:28:44 PM'
    , '7/23/2024 12:53:18 PM'
    , '0x8DCAB597AF04A5D'
    , 2380580
    , 'image/avif'
    , null
    , null
    , 'BlockBlob'
    , 'Cool'
    , '{"Description":"This is a description.","FileName":"20190611_120704.jpg"}'
    , null
    , null
    , '[{"Date":"2019-06-17"},{"Index":"1"},{"PAN":"23567"},{"Phase":"Design"},{"Primary":"False"},{"Project ID":"3484"}]'
    , 6
    , null),
    ('blobstoragename'
    , 'project-images/dd7f2b7e-a824-4ab9-992f-4eae791f8bc6'
    , '7/22/2024 2:28:44 PM'
    , '7/22/2024 2:28:45 PM'
    , '0x8DCAA9DA602D97F'
    , 1668161
    , 'image/avif'
    , null
    , null
    , 'BlockBlob'
    , 'Cool'
    , '{"Description":"TEST2","FileName":"20190611_120706.jpg"}'
    , null
    , null
    , '[{"Date":"2019-06-17"},{"Index":"2"},{"PAN":"987"},{"Phase":"Construction"},{"Primary":"False"},{"Project ID":"3484"}]'
    , 6
    , null); 
    
    INSERT INTO [BlobSync].[BlobInventory] 
        SELECT 
            AccountName, [Name], [CreationTime], [LastModified],
            [Etag], [ContentLength], [ContentType], [ContentEncoding],
            [ContentLanguage], [BlobType], [AccessTier], [Metadata],
            [Deleted], [RemainingRetentionDays], [Tags], [TagCount],
            [LastUpdatedUTC]
        FROM 
            #TempTableInsert 
        WHERE 
            (#TempTableInsert.[AccountName] + '/' + #TempTableInsert.[Name] NOT IN (SELECT [BlobInventory].[AccountName] + '/' + [BlobInventory].[Name] FROM [BlobSync].[BlobInventory])); 
    

    我以前使用过此脚本,没有出现错误,并且它确实有效,但不知为什么,此SQL代码在我的C#脚本中或在我在Contoso中使用时无法工作(第二条记录)。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Joel Coehoorn    1 年前

    这个 TagCount Tags 字段在列列表和列数据之间颠倒。所以你把价值 6 进入之内 标签 和长值 [{"Date":"2019-0... 进入之内 标签计数 .


    当我在这里的时候,它是 不正确 将日期时间值作为SQL文本提供,如下所示: 7/22/2024 2:28:44 PM 不同的语言和文化对日期和时间的格式有自己的期望。SQL语言没有什么不同,只是因为它是一种编程语言。

    该值的格式应采用以下两种方式之一:

    2024-07-22T14:28:44  (ie: yyyy-MM-ddTHH:mm:ss)
    20240722 14:28:44  (ie: yyyyMMdd HH:mm:ss)
    

    如果你只有日期(没有时间),唯一正确的选项如下:

    20240722 (ie: yyyyMMdd - no seperators!)
    

    其他的都是 错误的 ,并使您容易接受潜在的无效输入或读取错误的日期。