gpt4 book ai didi

sql-server - 如果sysname不能为null,那么在这个SQL Server系统存储过程中sysname怎么可能= null呢?

转载 作者:行者123 更新时间:2023-12-02 03:29:21 25 4
gpt4 key购买 nike

我读到sysname cannot be null ,但在系统过程 sp_grantdbaccess 的定义中,我看到将 null 分配给过程的参数之一(如果我没看错的话)。怎么会这样?

ALTER PROCEDURE [sys].[sp_grantdbaccess]
@loginame sysname,
@name_in_db sysname = NULL OUT

最佳答案

SYSNAME 不能为NULL”是不正确的。当链接问题的答案说它相当于 NVARCHAR(128) NOT NULL 作为默认时,它是正确的 - 然后有效地列定义。比较:

-- When not specified, columns are NULL
SET ANSI_NULL_DFLT_ON ON

-- Works
CREATE TABLE T(N NVARCHAR(128)); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO

-- When not specified, columns are NOT NULL
SET ANSI_NULL_DFLT_ON OFF

-- Error: can't insert NULL
CREATE TABLE T(N NVARCHAR(128)); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO

现在尝试使用 SYSNAME 进行相同的操作:

-- When not specified, columns are NULL
SET ANSI_NULL_DFLT_ON ON

-- Error: SYSNAME is NOT NULL, regardless of defaults
CREATE TABLE T(N SYSNAME); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO

但这并不意味着SYSNAME不能为NULL,我们所要做的就是说它可能是:

-- Works
CREATE TABLE T(N SYSNAME NULL); INSERT T DEFAULT VALUES; SELECT * FROM T
GO
DROP TABLE T
GO

在几乎所有其他使用类型的上下文中(变量、存储过程参数),我们不能指定 NULLNOT NULLNULL 值始终是允许的,因此此 NOT NULL 元数据很少相关。上面的代码使用常规表并非偶然:如果您对表变量尝试同样的操作,您会发现 ANSI_NULL_DFLT_ON 被忽略,并且 NULL 始终是如果未指定,则列的默认值,因此唯一相关的情况是:

-- Can't insert NULL
DECLARE @T TABLE (N SYSNAME); INSERT @T DEFAULT VALUES; SELECT * FROM T@
GO

-- OK
DECLARE @T TABLE (N SYSNAME NULL); INSERT @T DEFAULT VALUES; SELECT * FROM @T
GO

关于sql-server - 如果sysname不能为null,那么在这个SQL Server系统存储过程中sysname怎么可能= null呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52285088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com