Создать обнуляемый столбец, используя SQL Server SELECT INTO? - PullRequest
29 голосов
/ 29 марта 2011

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

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

Ответы [ 6 ]

25 голосов
/ 29 марта 2011

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

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

Пример (константные литералы кажутся проблематичными - нужна хорошая функция 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
11 голосов
/ 03 декабря 2013

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

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

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

2 голосов
/ 24 марта 2016

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
1 голос
/ 09 сентября 2015

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

select *
into #so20150909
from table
where 1=0
1 голос
/ 09 сентября 2015

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

SELECT COLUMN1, COLUMN2, COLUMN3 INTO DestinationTable from SourceTable

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

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

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

0 голосов
/ 21 мая 2013

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

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]

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...