【问题标题】:SQL Server self-update TRUNCATE value using ISNULLSQL Server 使用 ISNULL 自我更新 TRUNCATE 值
【发布时间】:2015-10-01 18:41:56
【问题描述】:

我不知道这是否是一个错误。

我发现在运行此代码时,MyComments 列中的值被截断为第一个字母。它似乎与变量@MYComments 的声明有关,因为在我将声明更改为VARCHAR(MAX) 之后它起作用了,但对我来说似乎很奇怪的是,如果没有将值设置为变量@MYComments 函数@987654325 @ 调用应该返回当前值。

DECLARE @MYComments AS VARCHAR

UPDATE [dbo].[TestIssue] 
SET MYComments = ISNULL(@MYComments,MYComments)

我能够使用这个脚本重现这个。

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.TestIssue
    (
    id int NOT NULL,
    MYComments varchar(MAX) NOT NULL
    )  ON [PRIMARY]
     TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.TestIssue SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
select Has_Perms_By_Name(N'dbo.TestIssue', 'Object', 'ALTER') as ALT_Per, Has_Perms_By_Name(N'dbo.TestIssue', 'Object', 'VIEW DEFINITION') as View_def_Per, Has_Perms_By_Name(N'dbo.TestIssue', 'Object', 'CONTROL') as Contr_Per 

INSERT INTO [dbo].[TestIssue]
           ([id]
           ,[MYComments])
     VALUES
           (1
           ,'MY COMMENT 1')
GO

SELECT * FROM [dbo].[TestIssue]

DECLARE @MYComments AS VARCHAR

UPDATE [dbo].[TestIssue] 
SET MYComments = ISNULL(@MYComments,MYComments)

SELECT * FROM [dbo].[TestIssue]

【问题讨论】:

    标签: sql-server truncate isnull


    【解决方案1】:

    您的问题在于声明:

    Declare @Mycomments VARCHAR
    

    这个声明意味着它是 1 个字符长,所以 ISNULL 的返回也应该是 1 个字符长。将声明更改为 VARCHAR(MAX)。它解决了你的问题。

    【讨论】:

    • 或将其更改为 VARCHAR(n) 其中n 是介于 1 和 8000 之间的合适值 - 不必是 (MAX)(2 十亿 个字符!)每时每刻!你只需要明确定义一个长度 ....
    • 假设你知道n ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2018-04-11
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多