将NULL值插入INT&STRING列

时间:2019-12-16 21:54:48

标签: sql sql-server

我需要在整数列和字符串列中插入空值,但是在获取值之前将其插入数据集中,对于字符串而言为“ ---”,对于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
    )

3 个答案:

答案 0 :(得分:0)

要插入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));

答案 1 :(得分:0)

此外,作为标准做法,您应始终使用查询参数为查询提供任何文字值,以避免出现“ SQL注入”问题。例如,您的查询现在将显示为:

INSERT INTO BOEMIC01
    (MICRO_DATE, MICRO_YEAR, MICRO_MONTH, [...]) 
    VALUES(?, ?, ? [...])

注意?符号,并注意它们不在引号中。

然后,当您执行查询时,您将同时提供SQL字符串和将按出现顺序替换每个?的值的数组。现在,SQL不能将任何值误解为“ SQL的一部分”,因为它不是 。每次都可以向同一SQL字符串提供不同的参数值集。

可以使用BJones的注释中提到的诸如NULLIF()之类的函数:NULLIF('---', ?) ...该参数的值将传递给NULLIF函数作为第二个论点。我认为这是处理您的要求的一种好方法(它应该作为“答案”提供)。

答案 2 :(得分:0)

这实际上取决于值的来源,但是例如,如果此插入内容位于存储过程中,并且这些值是通过参数输入的,则以下内容显示了如何确保指定情况下的null值。 (为简便起见,省略了其他重要专栏文章):

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)

但是,如果要从客户端应用程序传递此数据,请在客户端进行转换。