根据以下链接,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 位(因此 8 行构成 1 个字节),对吗?
对于 varchar 中的 NULL 值,每行仍然有 2 个字节的开销 - 这是真的吗?
最重要的问题:
我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB
我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小
添加的列:
alter table MyTable add TestVarchar10 varchar(10) …Run Code Online (Sandbox Code Playgroud) 有没有什么好方法可以避免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) 即使其中一个字段具有空值,我也需要从表中检索数据。下面是一个例子:
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)
此示例检索name并SUM(credit)只有当credit具有价值。name即使credit根本没有任何价值,我也需要从中检索所有内容。
这可能吗?
如何检查数字列中是否有空值
我想要这样的东西:
select * from table where column_numeric = ''
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,但是对于数字列来说,什么可以等效呢?
我必须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
根据MS 的知识库,
除了 COUNT,聚合函数忽略空值。
有谁知道我怎样才能让它正常工作,也就是说,如果它试图与值中的空值聚合,则返回空值?
例子:
SELECT SUM("col")
FROM (
SELECT NULL "col"
UNION
SELECT 1 "col"
) test
Run Code Online (Sandbox Code Playgroud)
我希望这个查询返回NULL,而不是 1。
考虑 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。
我想将 '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 的行?
SQL Server 有一个类型标志,称为is_nullable您可以在 上看到它sys.types。目前,(SQL Server 2019)它只设置为FALSE两种类型,sys.timestamp和sys.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
Run Code Online (Sandbox Code Playgroud)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 …
将 x 视为包含 null、0、1 的列。只有不到 1% 的行包含 1。0 和 Null 之间没有逻辑差异。
坚持在这里使用 isnull 而不是 NVL 是个好主意吗(性能)?