据我了解,在下面的查询中,如果第一个值NULLIF是空字符串,则应保留现有列的值。在我的实际查询中,这些是变量,但我在查询中放置了实际值以使其更短。
ISNULL(NULLIF(N'', N''), Pwd) => ISNULL(NULL, Pwd) => Pwd
相反,发生的情况是第一个字符被设置为值。运行下面的查询并留意 Pwd 的值。
DECLARE @tblHello TABLE (
UserID INT NOT NULL IDENTITY(1,1),
FirstName VARCHAR(50),
LastName VARCHAR(50),
CompanyName VARCHAR(80),
Pwd VARCHAR(100) NOT NULL,
Email VARCHAR(100) NOT NULL,
CreatedDate DATE NOT NULL DEFAULT SYSUTCDATETIME(),
LastUpdated DATE NOT NULL DEFAULT SYSUTCDATETIME(),
isActive BIT NOT NULL DEFAULT(1)
)
INSERT INTO @tblHello (FirstName, LastName, CompanyName, Pwd, Email)
VALUES ('First', 'Last', 'Testing this', 'This is the password', 'test@email.com')
UPDATE @tblHello
SET
Email = ISNULL(NULLIF(N'testuser58@email.com', ''), Email),
FirstName = ISNULL(NULLIF(N'Updated', ''), FirstName),
Pwd = ISNULL(NULLIF(N'', N''), Pwd),
LastName = ISNULL(NULLIF(N'YmFaADIDaQVauHF', ''), LastName),
isActive = ISNULL(NULLIF(1, ''), isActive),
CompanyName = ISNULL(NULLIF(N'Testing Co', ''), CompanyName)
WHERE UserID = 1
SELECT *
FROM @tblHello
Run Code Online (Sandbox Code Playgroud)
我得到 Pwd 的以下结果:(省略其余列)
Pwd CompanyName Email
T Testing Co testuser58@email.com
Run Code Online (Sandbox Code Playgroud)
无论有或没有前置“N”,都会发生这种情况。为什么会发生这种情况?
ISNULL()将替换值转换为检查表达式的类型。在你的情况下,它默认为CHAR(1).
根据MSDN
如果check_expression的值不为NULL,则返回该值;否则,如果类型不同,则将 replacement_value 隐式转换为 check_expression 的类型后返回。如果 replacement_value 长于 check_expression,则 replacement_value 可以被截断。
您应该使用COALESCE()而不是ISNULL()避免任何截断。
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |