标签: null

用于 NULL 值的存储空间

根据以下链接,NULL值占用一些存储空间:

/sf/ask/261182071/
https://www.sqlservercentral.com/forums/topic/null-storage-2

如果列具有固定宽度数据类型 -NULL占用列的长度

char(10) NULL takes 10 bytes
INT NULL takes 4 bytes
Run Code Online (Sandbox Code Playgroud)

如果列具有可变宽度 -NULL占用 0 字节

varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)
Run Code Online (Sandbox Code Playgroud)

另外,拥有可为空的列也会产生开销。链接中的信息有点矛盾。
任何人都可以阐明这一点吗?

这是我的问题:

  1. 有人说可空列的开销是每行 1 位,有人说是每行 1 个字节,
    哪一个是正确的?我假设每行 1 位(因此 8 行构成 1 个字节),对吗?

  2. 对于 varchar 中的 NULL 值,每行仍然有 2 个字节的开销 - 这是真的吗?

  3. 最重要的问题:
    我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB
    我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小

添加的列:

alter table MyTable add TestVarchar10 varchar(10) …
Run Code Online (Sandbox Code Playgroud)

null sql-server storage sql-server-2017

2
推荐指数
1
解决办法
1722
查看次数

处理这么多 isnull() 情况的更简单方法

有没有什么好方法可以避免isnull()在存储过程中多次编写函数?

我有一个使用该isnull()函数近 30 次的存储过程,我认为我缺少一个概念,但是在找到更好的方法来获取我的数据之前,我会喜欢从这么多isnull()函数中清理我的代码。

我可以暂时将 SQL Server 2008 R2 设置为使用空值作为浮点 0 吗?isnull()如果没有数据,我的大部分内容只是添加零 0 值,以便我可以进行数学运算。

编辑:我不是懒惰,我只是想清理我的代码并避免选择部分看起来像这样

select  
   vrsta.NAZIV
   ,isnull(sum(prod.prod_mpci),0) as prod_MPCI
   ,isnull(sum(isnull(mal_MPCI,0) + (vel_kol * isnull(mal_MPC,vel_VPC))),0) as lager_mpci
   ,isnull(sum(vel_NCI),0)+isnulL(sum(mal_NCI),0) as lager_nci
   ,sum(   case 
            when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu
                    then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_MPC,vel_VPC)
                    else 0 end
            ) as visak_MPC
   ,sum(   case 
            when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu
                    then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_NC,vel_NC)
                    else 0 end
            ) as visak_MPC
    ,sum(   case …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 null sql-server t-sql

1
推荐指数
1
解决办法
6423
查看次数

选择查询以检索具有空值的行

即使其中一个字段具有空值,我也需要从表中检索数据。下面是一个例子:

Select name, SUM(credit) as credit
From expenses
Where name like 'vendor0%'
and date like '2013%'
Group by name
Order by name asc
Run Code Online (Sandbox Code Playgroud)

此示例检索nameSUM(credit)只有当credit具有价值。name即使credit根本没有任何价值,我也需要从中检索所有内容。

这可能吗?

postgresql null aggregate select

1
推荐指数
1
解决办法
3万
查看次数

检查数字列中是否有空单元格

如何检查数字列中是否有空值

我想要这样的东西:

select * from table where column_numeric = ''
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,但是对于数字列来说,什么可以等效呢?

null datatypes

1
推荐指数
1
解决办法
1万
查看次数

ISNULL() OR 在 UPDATE 语句中为 NULL

我必须UPDATE在具有 50 万条记录的实时在线数据库上运行一条语句。我想知道哪个语句运行得更快:

Update Table set REC_ID = isnull(REC_ID,'')

Update Table set REC_ID = '' where REC_ID is null
Run Code Online (Sandbox Code Playgroud)

我正在使用 Microsoft SQL Server 2012

null sql-server sql-server-2012 update

1
推荐指数
1
解决办法
5万
查看次数

SQL Server 的聚合函数忽略空值。我该如何纠正?

根据MS 的知识库

除了 COUNT,聚合函数忽略空值。

有谁知道我怎样才能让它正常工作,也就是说,如果它试图与值中的空值聚合,则返回空值?

例子:

SELECT SUM("col")
FROM (
    SELECT NULL "col"
    UNION
    SELECT 1 "col"
) test
Run Code Online (Sandbox Code Playgroud)

我希望这个查询返回NULL,而不是 1。

null sql-server aggregate

1
推荐指数
1
解决办法
3773
查看次数

将空字符串转换为空日期时间

考虑 Microsoft SQL Server 2012 中的以下代码:

INSERT INTO [dbo].Production
SELECT [field1]
      ,[field2]
      ,cast([datefield] as datetime)
FROM [RAW].Staging
Run Code Online (Sandbox Code Playgroud)

临时表加载了来自 CSV 文件的数据。因此,在某些情况下,我们最终会得到空字段,而不是 NULL 字段。因此,日期字段在插入生产表时会转换为 1900-01-01 日期。

我想知道在上面的插入代码中是否有什么我可以做的,以确保当来自临时表的字段为 NULL 或为空时,日期字段设置为 NULL。

null sql-server t-sql cast datetime

1
推荐指数
1
解决办法
2万
查看次数

NULL 作为 WHERE 子句中的 @variable

我想将 'IS NULL' 设置为变量并在 WHERE 子句中使用它。我会将许多带有相同 WHERE 子句的表合并在一起,并希望灵活地为我的yearCompleted列使用一个变量- 请参见下面的示例 -

DECLARE @YEARCOMPLETED
SET @YEARCOMPLETED = NULL

SELECT * FROM TABLE1
WHERE yearCompleted = @YEARCOMPLETED
UNION ALL
SELECT * FROM TABLE2
WHERE yearCompleted = @YEARCOMPLETED
Run Code Online (Sandbox Code Playgroud)

在这种情况下,是否可以使用变量找到 yearCompleted 为 NULL 的行?

null sql-server

1
推荐指数
1
解决办法
92
查看次数

SQL Server 的 is_nullable 有什么意义吗?

SQL Server 有一个类型标志,称为is_nullable您可以在 上看到它sys.types。目前,(SQL Server 2019)它只设置为FALSE两种类型,sys.timestampsys.sysname. 对sys.timestamp这种类型似乎接受null。在sys.sysname它没有。这种行为有什么解释吗?

你可以看到这些类型

SELECT * FROM sys.types WHERE is_nullable = 0;  
SELECT TYPEPROPERTY('timestamp', 'AllowsNull');  -- returns 0
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它,

CREATE TABLE foo ( a sys.timestamp );
INSERT INTO foo (a) VALUES ( null );
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用,这将不起作用 sys.sysname

Msg 515 Level 16 State 2 Line 1
Cannot insert the value NULL into column 'a', table 'dbo.foo'; column does not allow nulls. INSERT …
Run Code Online (Sandbox Code Playgroud)

null sql-server datatypes metadata sql-server-2019

1
推荐指数
2
解决办法
78
查看次数

是 where x = 0 或 x is null 被替换为 where isnull(x, 0) = 0 resp。其中 NVL(x, 0) = 0

将 x 视为包含 null、0、1 的列。只有不到 1% 的行包含 1。0 和 Null 之间没有逻辑差异。

坚持在这里使用 isnull 而不是 NVL 是个好主意吗(性能)?

null oracle sql-server

0
推荐指数
1
解决办法
1311
查看次数