使用 SELECT * INTO 时收到非 NULL 警告

Posted

技术标签:

【中文标题】使用 SELECT * INTO 时收到非 NULL 警告【英文标题】:Getting a non-NULL-able warning when using SELECT * INTO 【发布时间】:2018-05-16 16:40:27 【问题描述】:

当我执行以下过程时,我收到此警告:

正在尝试将不可为 NULL 的列的值设置为 NULL。

USE [DbTwo]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

alter proc [dbo].[TEST_warning_proc]
as 

IF OBJECT_ID('MySchema..vitals', 'U') IS NOT NULL DROP TABLE MySchema..vitals
IF OBJECT_ID('MySchema..order_list', 'U') IS NOT NULL DROP TABLE MySchema..order_list

select * into MySchema..vitals
from DbOne..vitals
where FacilityID in
 (select FacilityID from DbTwo..MySchemaFacilities)

select * into MySchema..order_list
from DbOne..order_list
where FacilityID in
 (select FacilityID from DbTwo..MySchemaFacilities)

既然我正在执行 SELECT * INTO,这怎么可能?那不应该创建一个完全反映原始表的新表吗?

我试过设置:

SET ANSI_WARNINGS OFF

但这没有帮助。

【问题讨论】:

你的表有计算列吗? 您是在使用 select *,还是为了简洁而缩短了查询?如果是后者,您是否可以添加任何您正在调用的任何内置或标量函数(cast、left、ufn() 等)的列或任何不简单列出列名的列? 【参考方案1】:

我怀疑你的表没有被删除--maybe there is a block going on 这个辅助函数。您可以通过在尝试删除它后立即放置 select top 1 * from vitals 来验证此理论。这可以通过使用sys.objects 来避免。 使用 sys.objects

create table dbo.vitals (c1 int not null)

insert into vitals
values
(1)

if exists(SELECT 1 FROM sys.objects WHERE name = N'vitals')
begin
    drop table vitals
end

select null as c1 into vitals

select * from vitals

ONLINE DEMO

【讨论】:

真的希望您的怀疑是正确的,但不幸的是事实并非如此。桌子真的被扔掉了;当我尝试在掉落后查询它们时,没有这样的对象。 那么一定有约束问题。有没有引用这些的表格? 根本没有引用新表的内容。我刚刚在我的 proc 中创建了这些新表,其他人甚至都不知道它们。但我不明白可能存在什么样的约束问题:它们正在成功下降。 SELECTing * INTO 时什么样的约束会导致错误? 你是对的,因为如果它们上有一个 FK,当它们被丢弃时你会得到一个错误......我还不能重现这个。如果将表更改为另一个表名会发生什么情况。同样的问题? “将表改成其他表名”是什么意思?【参考方案2】:

我发现了问题...

当我“清理”我的 proc 以便在此处发布时,我使用了这些名称

from DbOne..vitals

from DbOne..order_list

这两个对象实际上是 views 而不是 tables。我尝试从视图的定义中运行原始 SELECT 并得到:

通过聚合或其他 SET 操作消除空值。

糟糕...我很抱歉。

【讨论】:

嘿...这不公平:) 是的,有点让这个问题无法回答,不是吗?特别是当我在我的问题中称它们为“表格”时......:-/

以上是关于使用 SELECT * INTO 时收到非 NULL 警告的主要内容,如果未能解决你的问题,请参考以下文章

select * into outfile 即使对于 root 也不起作用

SELECT * INTO newtable 不起作用

INTO 子句不允许错误

调用 OPENROWSET 时 INSERT INTO 和 SELECT INTO 的区别

关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常

从 RDS SELECT * INTO OUTFILE 到 S3