【问题标题】:Getting error Attempting to set a non-NULL-able column's value to NULL while insert into in temp table在插入到临时表中时出现错误尝试将不可为 NULL 的列的值设置为 NULL
【发布时间】:2022-12-11 06:26:40
【问题描述】:

以下是我收到错误的查询

Declare @WorldpayAccountKeys varchar(max)='9132E282-2602-4D54-86CF-C93F9A56CF34
,E3759AFF-6968-40C1-8ABD-A25AE9176C1A
,B276D9C8-CC13-47C8-A469-76F8946AF6C0
,BCE689AD-CDC4-42D1-8718-69902ACCA9C3
,BCE689AD-CDC4-42D1-8718-69902ACCA9C4'


    SELECT fooAccountId as abc, T.RowNum, T.Value
    into #temp
    FROM
        (
            SELECT O.Value, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) as RowNum
            FROM string_split(@WorldpayAccountKeys,',') O
        ) T
        LEFT JOIN 
            foo R ON R.fooKey= T.Value  
            AND (R.foocId IN (11,12,13,14))
            AND R.fooIndex = 0

我知道错误是针对列 fooAccountId 的,它是主键而不是 null,我从此查询中获取了一条针对列 fooAccountId 的空记录

我试过,将 null 应用于主键但它插入了临时表,为什么不使用上述查询

从 foo 中选择 fooAccountId 作为 abc 进入#b 联合所有 选择空

需要帮助,使用 sql server 2017

示例查询出错:

CREATE TABLE [dbo].[WA](
    [WAid] [bigint] IDENTITY(1,1) NOT NULL,
    [WAKey] [uniqueidentifier] NOT NULL,
    [WATypeRefKey] [char](1) NOT NULL,
    [AccountId] [varchar](111) NULL,
    [AccountToken] [varchar](111) NULL,
    [AcceptorId] [varchar](111) NULL,
    [ApplicationId] [varchar](111) NULL,
    [ClientId] [int] NOT NULL,
    [Version] [int] NOT NULL,
    [VersionOn] [datetimeoffset](7) NOT NULL,
    [VersionBy] [varchar](111) NOT NULL,
    [RemovedIndex] [smallint] NOT NULL,
CONSTRAINT [WA_PKey] PRIMARY KEY CLUSTERED
(
    [WAid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[WA] ON
GO
INSERT [dbo].[WA] ([WAid], [WAKey], [WATypeRefKey], [AccountId], [AccountToken], [AcceptorId], [ApplicationId], [ClientId], [Version], [VersionOn], [VersionBy], [RemovedIndex]) VALUES (1, N'9132e282-2602-4d54-86cf-c93f9a56cf34', N'Y', N'11', N'11', N'11', N'11', 11, 1, CAST(N'2022-11-30T00:00:00.0000000+00:00' AS DateTimeOffset), N'test', 0)
GO
INSERT [dbo].[WA] ([WAid], [WAKey], [WATypeRefKey], [AccountId], [AccountToken], [AcceptorId], [ApplicationId], [ClientId], [Version], [VersionOn], [VersionBy], [RemovedIndex]) VALUES (3, N'e3759aff-6968-40c1-8abd-a25ae9176c1a', N'Y', N'12', N'12', N'12', N'12', 12, 1, CAST(N'2022-12-01T18:14:11.5300000+00:00' AS DateTimeOffset), N'Test', 0)
GO
INSERT [dbo].[WA] ([WAid], [WAKey], [WATypeRefKey], [AccountId], [AccountToken], [AcceptorId], [ApplicationId], [ClientId], [Version], [VersionOn], [VersionBy], [RemovedIndex]) VALUES (6, N'b276d9c8-cc13-47c8-a469-76f8946af6c0', N'Y', N'13', N'13', N'13', N'13', 13, 1, CAST(N'2022-12-01T23:02:40.3164474+05:30' AS DateTimeOffset), N'Test', 0)
GO
INSERT [dbo].[WA] ([WAid], [WAKey], [WATypeRefKey], [AccountId], [AccountToken], [AcceptorId], [ApplicationId], [ClientId], [Version], [VersionOn], [VersionBy], [RemovedIndex]) VALUES (8, N'bce689ad-cdc4-42d1-8718-69902acca9c3', N'Y', N'134', N'14', N'14', N'14', 14, 1, CAST(N'2022-12-01T23:04:04.8758186+05:30' AS DateTimeOffset), N'Test', 0)
GO
INSERT [dbo].[WA] ([WAid], [WAKey], [WATypeRefKey], [AccountId], [AccountToken], [AcceptorId], [ApplicationId], [ClientId], [Version], [VersionOn], [VersionBy], [RemovedIndex]) VALUES (11, N'bce689ad-cdc4-42d1-8718-69902acca9c4', N'Y', N'135', N'15', N'15', N'15', 15, 1, CAST(N'2022-12-06T08:25:23.3533330+00:00' AS DateTimeOffset), N'Test', 0)
GO



Declare @WorldpayAccountKeys varchar(max)='9132E282-2602-4D54-86CF-C93F9A56CF34
,E3759AFF-6968-40C1-8ABD-A25AE9176C1A
,B276D9C8-CC13-47C8-A469-76F8946AF6C0
,BCE689AD-CDC4-42D1-8718-69902ACCA9C3
,BCE689AD-CDC4-42D1-8718-69902ACCA9C4'

drop table #temp
    SELECT [WAid] as abc, T.RowNum, T.Value
    into #temp
    FROM
        (
            SELECT O.Value, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) as RowNum
            FROM string_split(@WorldpayAccountKeys,',') O
        ) T
        LEFT JOIN 
            [WA] R ON R.[WAKey]= T.Value  
            AND (R.ClientId IN (11,12,13,14))
            AND R.RemovedIndex = 0

【问题讨论】:

  • @Larnu 附加示例查询
  • 那么...BCE689AD-CDC4-42D1-8718-69902ACCA9C4ClientId 值是多少?
  • 解决方法是执行 SELECT [WAid]+0 as abc - 它似乎没有适当考虑该列可以为 NULL,因为该表是外部连接的 - 可能是因为 SELECT INTO 将保留 IDENTITY 属性
  • 我删除它以查看用户是否传递了变量 WorldpayAccountKeys 但它们不存在于我的表中。这使我能够确定缺少哪些@WorldpayAccountKeys。
  • ISNULL 为我工作,但想知道导致错误的原因

标签: sql-server sql-server-2017


【解决方案1】:

这个SELECT INTO自动创建的表是

CREATE TABLE  #temp(
    [abc] [bigint] IDENTITY(1,1) NOT NULL,
    [RowNum] [bigint] NULL,
    [Value] [varchar](max) NULL
) 

IDENTITY 属性的复制可能会导致问题,因为这将要求列为 NOT NULL

实际情况是,由于外部联接与 IDENTITY(需要 NOT NULL)不兼容,因此此列的输出在您的查询中可能为空。

您可以通过对列执行无操作计算来禁止复制属性。

例如

SELECT [WAid]+0 as abc

代替

SELECT [WAid] as abc

结果表定义是

CREATE TABLE  #temp(
    [abc] [bigint] NULL,
    [RowNum] [bigint] NULL,
    [Value] [varchar](max) NULL
) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2017-08-26
    • 2011-09-29
    • 1970-01-01
    • 2014-12-29
    相关资源
    最近更新 更多