=== Как насчет будущей проверки и повторного использования кода? ===
Если вы не пишете код, чтобы освобождать объекты, тогда вы ограничиваете использование кода только безопасным, если вы можете зависеть от свободной памяти в процессе, являющемся закрытые ... т. е. небольшие одноразовые проекты или «отбрасывающие» [1] проекты) ... где вы знаете, когда процесс закончится.
Если вы пишете код, свободный ( ) вся ваша динамически распределенная память, тогда вы будете в будущем проверять код и позволять другим использовать его в более крупном проекте.
[1] относительно проектов «выбросить». Код, используемый в проектах «Отбрасывание», имеет способ не выбрасываться. Следующее, что вы знаете, прошло десять лет, и ваш код «выкидывания» все еще используется).
Я слышал рассказ о каком-то парне, который написал какой-то код просто для удовольствия, чтобы улучшить его работу. Он сказал: « просто хобби, не будет большим и профессиональным ». Спустя годы многие люди используют свой «хобби» код.
Обнуляемость наследуется от исходного столбца.
Вы можете потерять или получить обнуляемость с помощью выражения:
Пример (константные литералы кажутся проблематичными - нужна хорошая функция 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
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
Если вы хотите наследовать nullablity для столбца назначения независимо от столбцов исходной таблицы, вы можете выполнить этот запрос.
SELECT COLUMN1, COLUMN2, COLUMN3 INTO DestinationTable from SourceTable
, если это был ваш запрос, где COLUMN1, COLUMN2, COLUMN3 не могли обнуляться в SourceTable, измените запрос на
SELECT NULL COLUMN1, NULL COLUMN2, NULL COLUMN3 INTO DestinationTable from SourceTable
, так что это позволит вам вставить нулевые значения в пункт назначения таблица.
У меня недавно была та же проблема - я хотел использовать «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]
С уважением.
Это работает также.
select *
into #so20150909
from table
where 1=0
Это решение, которое я недавно придумал, и хотя я должен поделиться им:
select top 0
B.*
into
TargetTable
from
SourceTable as A
left join SourceTable as B on 1 = 0
Это эффективно создает дублированную структуру SourceTable
в TargetTable
со всеми столбцами, допускающими обнуление (по крайней мере, в sql2008 ).