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

=== Как насчет будущей проверки и повторного использования кода? ===

Если вы не пишете код, чтобы освобождать объекты, тогда вы ограничиваете использование кода только безопасным, если вы можете зависеть от свободной памяти в процессе, являющемся закрытые ... т. е. небольшие одноразовые проекты или «отбрасывающие» [1] проекты) ... где вы знаете, когда процесс закончится.

Если вы пишете код, свободный ( ) вся ваша динамически распределенная память, тогда вы будете в будущем проверять код и позволять другим использовать его в более крупном проекте.


[1] относительно проектов «выбросить». Код, используемый в проектах «Отбрасывание», имеет способ не выбрасываться. Следующее, что вы знаете, прошло десять лет, и ваш код «выкидывания» все еще используется).

Я слышал рассказ о каком-то парне, который написал какой-то код просто для удовольствия, чтобы улучшить его работу. Он сказал: « просто хобби, не будет большим и профессиональным ». Спустя годы многие люди используют свой «хобби» код.

29
задан mattmc3 28 March 2011 в 21:23
поделиться

6 ответов

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

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

Пример (константные литералы кажутся проблематичными - нужна хорошая функция 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
25
ответ дан Cade Roux 28 March 2011 в 21:23
поделиться

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
2
ответ дан wezzix 28 March 2011 в 21:23
поделиться
  • 1
    +1 для злых взглядов и использования макросов выше и вне служебного долга. – EvilTeach 2 April 2010 в 22:20
  • 2
    +1 для злых взглядов и использования макросов выше и вне служебного долга. – EvilTeach 2 April 2010 в 22:20
  • 3
    +1 для злых взглядов и использования макросов выше и вне служебного долга. – EvilTeach 2 April 2010 в 22:20
  • 4
    +1 для злых взглядов и использования макросов выше и вне служебного долга. – EvilTeach 2 April 2010 в 22:20
  • 5
    +1 для злых взглядов и использования макросов выше и вне служебного долга. – EvilTeach 2 April 2010 в 22:20

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

SELECT COLUMN1, COLUMN2, COLUMN3 INTO DestinationTable from SourceTable

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

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

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

1
ответ дан Rohit Gupta 28 March 2011 в 21:23
поделиться

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

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] & amp; [Z _2] - два фиктивных столбца, используемые для объединения

Затем для очистки:

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

delete dbo.I_Data where [Z_1] = 1

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

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

С уважением.

0
ответ дан David P Reynevich 28 March 2011 в 21:23
поделиться

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

select *
into #so20150909
from table
where 1=0
1
ответ дан UnhandledExcepSean 28 March 2011 в 21:23
поделиться

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

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

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

11
ответ дан Kuba Wyrostek 28 March 2011 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: