将NULL值插入INT&STRING列

问题描述 投票:0回答:3

我需要在整数列和字符串列中插入空值,但要在获取值之前将其插入数据集中,对于字符串来说是“ ---”,对于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
    )
sql sql-server
3个回答
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));

0
投票

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

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

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

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

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


0
投票

这实际上取决于值的来源,但是例如,如果此插入内容位于存储过程中,并且这些值是通过参数输入的,则以下内容显示了如何确保指定情况下的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)

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

© www.soinside.com 2019 - 2024. All rights reserved.