Подтвердить что ты не робот

Создать столбец с нулевым значением, используя SQL Server SELECT INTO?

Когда я создаю временную таблицу с помощью select into в SQL Server, есть ли способ указать, что столбец должен быть нулевым? У меня многоэтапный процесс, когда я создаю временную таблицу, выбирая много столбцов (поэтому я не делаю create table #tmp (...)). После того, как я создаю эту временную таблицу, я обновляю некоторые столбцы, и некоторые из этих обновлений могут обнулить поле.

Я знаю, что могу сделать оператор alter table alter column для достижения того, чего хочу, но мне интересно, есть ли способ указать это в самой select. Я знаю, что вы можете встраивать cast ваши столбцы, чтобы получить нужный тип данных, но я не вижу, как вы указываете значение nullability.

4b9b3361

Ответ 1

Nullability наследуется от исходного столбца.

Вы можете потерять или получить значение nullability с выражением:

Пример (константные литералы кажутся проблематичными - нужна хорошая функция NOOP, которая может возвращать NULL):

CREATE TABLE SO5465245_IN
    (
     a INT NOT NULL
    ,b INT NULL
    ) ;
GO

SELECT  COALESCE(a, NULL) AS a
       ,ISNULL(b, 0) AS b
       ,COALESCE(10, NULL) AS c1
       ,COALESCE(ABS(10), NULL) AS c2
       ,CASE WHEN COALESCE(10, NULL) IS NOT NULL THEN COALESCE(10, NULL) ELSE NULL END AS c3
INTO    SO5465245_OUT
FROM    SO5465245_IN ;
GO

SELECT  TABLE_NAME
       ,COLUMN_NAME
       ,IS_NULLABLE
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME LIKE 'SO5465245%'
ORDER BY TABLE_NAME
       ,ORDINAL_POSITION ;
GO

DROP TABLE SO5465245_IN ;
GO

DROP TABLE SO5465245_OUT ;
GO

Ответ 2

Эта душа, которую я недавно придумал, и хотя я должен поделиться:

select top 0
  B.*
into
  TargetTable
from
  SourceTable as A
    left join SourceTable as B on 1 = 0

Это эффективно создает дублируемую структуру SourceTable в TargetTable, при этом все столбцы обнуляются (по крайней мере, в sql2008).

Ответ 3

CONVERT сделает ваши столбцы обнуляемыми, а также работает для литералов/констант. Протестировано в SQL Server 2005/2008.

SELECT 
    SomeText = CONVERT(varchar(10), 'literal'),
    SomeNumber = CONVERT(int, 0)
INTO SO5465245

INSERT SO5465245 VALUES (null, null)

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SO5465245'
ORDER BY TABLE_NAME, ORDINAL_POSITION

DROP TABLE SO5465245

Ответ 4

Если вы хотите наследовать значение nullablity для столбца назначения независимо от столбцов исходной таблицы, вы можете следовать этому запросу.

SELECT COLUMN1, COLUMN2, COLUMN3 INTO DestinationTable from SourceTable

если это был ваш запрос, в котором COLUMN1, COLUMN2, COLUMN3 не были нулевыми в SourceTable, тогда измените запрос как

SELECT NULL COLUMN1, NULL COLUMN2, NULL COLUMN3 INTO DestinationTable from SourceTable

поэтому это позволит вам вставлять нулевые значения в таблицу назначения.

Ответ 5

Это также работает.

select *
into #so20150909
from table
where 1=0

Ответ 6

Недавно у меня была такая же проблема - я хотел использовать "select into", хотел, чтобы все столбцы в целевой таблице были обнуляемы и повторялись, когда мне не нужно было знать имена полей в исходной таблице.

select *
into dbo.I_Data
from
  (select 1[Z_1]) A
  full join (select null[Z_2], * from dbo.S_Data) B on A.Z_1 = B.Z_2

где dbo.S_Data - это таблица исходных данных и [Z_1] и [Z_2] - два фиктивных столбца, используемые для соединения

Затем очистить:

(a) Удалите строку с нулями

delete dbo.I_Data where [Z_1] = 1

(b) Удалите фиктивные поля:

alter table dbo.I_Data 
  drop column [Z_1], [Z_2]

С уважением.