使用 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 也不起作用
调用 OPENROWSET 时 INSERT INTO 和 SELECT INTO 的区别