我需要在整数列和字符串列中插入空值,但要在获取值之前将其插入数据集中,对于字符串来说是“ ---”,对于INT来说是“ NA”,当需要时您已经将那些值插入为void我正在使用SQL Sever,而我的查询就是这样。
INSERT INTO BOEMIC01
(MICRO_DATE, MICRO_YEAR, MICRO_MONTH, MICRO_WEEK, MICRO_DIVISION, MICRO_SUBDIVISION, MICRO_CODE_COUNTRY, MICRO_COUNTRY, MICRO_CODE_CENTER, MICRO_CENTER, MICRO_FREQ, MICRO_TOTAL_M, MICRO_TOTAL_Y, MICRO_TOTAL_Z, MICRO_ID_PROCESS, MICRO_DESC_PROCESS, MICRO_TOTAL_A, MICRO_TOTAL_B, MICRO_TOTAL_C, MICRO_ID_POINT, MICRO_DESC_POINT, MICRO_CODE_MATERIAL, MICRO_DESC_MATERIAL, MICRO_TOTAL_D, MICRO_TOTAL_E, MICRO_TOTAL_F) VALUES
(
'2019-01-15',
'2019',
'1',
'3',
'X',
'Y',
'P001',
'USA',
'USA1',
'USA2',
'Daily',
'2',
'2',
'0',
'158',
'Enva',
'2',
'2',
'0',
'344',
'2',
'---', --NULL
'---', --NULL
'NA', --NULL
'NA', --NULL
'NA' --NULL
)
要插入NULL
值,请使用NULL
关键字。如:
insert into t (col)
values (null);
要插入默认值,通常为null
,只需将列完全排除在列列表之外:
insert into t (col1)
values ('happy value');
[col2
将设置为其默认值,如果未定义其他默认值,则为NULL
。
如果从其他来源插入值,则使用try_convert()
或nullif()
例如:
insert into t (col_str, col_int)
values (nullif(@col_str, '---'), try_convert(int, @col_int));
此外,作为标准做法,您应该始终使用query parameters为查询提供任何文字值,以避免出现“ SQL注入”问题。例如,您的查询现在将显示为:
INSERT INTO BOEMIC01
(MICRO_DATE, MICRO_YEAR, MICRO_MONTH, [...])
VALUES(?, ?, ? [...])
注意?
符号并注意它们不在引号中。
然后,当您执行查询时,您将同时提供SQL字符串和将按出现顺序替换每个?
的值的数组。现在,SQL不能将任何值误解为“ SQL的一部分”,因为它不是。每次可以将不同的参数值集提供给同一SQL字符串。
您可以使用BJones的注释中提到的诸如NULLIF()
之类的函数:NULLIF('---', ?)
...该参数的值将作为第二个参数传递给NULLIF
函数。我认为这是处理您的要求的一种好方法(它应该作为“答案”提供)。
这实际上取决于值的来源,但是例如,如果此插入内容位于存储过程中,并且这些值是通过参数输入的,则以下内容显示了如何确保指定情况下的null
值。 (为简便起见,省去了Irelevant栏):
INSERT INTO BOEMIC01 (... MICRO_CODE_MATERIAL, MICRO_DESC_MATERIAL, MICRO_TOTAL_D, MICRO_TOTAL_E, MICRO_TOTAL_F)
select ...
, case when @MICRO_CODE_MATERIAL != '---' then @MICRO_CODE_MATERIAL else null end
, case when @MICRO_DESC_MATERIAL != '---' then @MICRO_CODE_MATERIAL else null end
, try_convert(int, @MICRO_TOTAL_D)
, try_convert(int, @MICRO_TOTAL_E)
, try_convert(int, @MICRO_TOTAL_F)
但是,如果要从客户端应用程序传递此数据,请在客户端进行转换。