Получение предупреждения, отличного от NULL, при использовании SELECT * INTO - PullRequest
0 голосов
/ 16 мая 2018

Когда я выполняю следующую процедуру, я получаю это предупреждение:

Попытка установить для столбца, не поддерживающего 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

, но это не помогло.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я обнаружил проблему ...

Когда я "дезинфицировал" свой процесс для публикации здесь, я использовал имена

from DbOne..vitals

и

from DbOne..order_list

Эти два объекта на самом деле представления не таблицы .Я попытался запустить исходный SELECT из определения представления и получил:

Нулевое значение устраняется с помощью агрегата или другой операции SET.

Упс... Мои извинения.

0 голосов
/ 16 мая 2018

Я подозреваю, что ваша таблица не падает - возможно, для этой вспомогательной функции идет блок .Вы можете проверить эту теорию, поместив 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

...