首页 > 解决方案 > 太长。最大长度为 128。使用双引号时

问题描述

我在 MSSQL 中有一个 SP,它将向 SQL 插入错误日志

ALTER PROCEDURE [dbo].[TestLog]


@PrimaryName nvarchar(255),
@ERROR nvarchar(4000)

AS
BEGIN


insert into Process_Log 
(
PrimaryName ,
ERROR
) VALUES
(
@PrimaryName ,
@ERROR
)

END

我的示例错误消息是这样的:

Violation of PRIMARY KEY constraint 'PK__AP__2EC21549E681BC94'. Cannot insert duplicate key in object 'dbo.Test'. The duplicate key value is (215009).
The statement has been terminated.

因为我在字符串中有 ',所以我必须使用双引号并 SET QUOTED_IDENTIFIER OFF。

我无法更改错误消息或对其进行编辑,因为它来自其他应用程序。

编辑:

我的进程表结构:

CREATE TABLE [dbo].[Process_Log](
    [PrimaryName] [nvarchar](255) NULL,
    [ERROR] [nvarchar](max) NULL
) 

标签: sql-serverstored-proceduressql-insert

解决方案


在您的查询中替换:

insert into Process_Log 
(
PrimaryName ,
ERROR
) VALUES
(
@PrimaryName ,
@ERROR
)

和:

insert into Process_Log 
(
PrimaryName ,
ERROR
) VALUES
(
@PrimaryName ,
REPLACE(@ERROR, '''', '''''')
)

这不会更改错误消息,只是“转义”单引号,以便 SQL Server 不会混淆。

您还需要摆脱这QUOTED_IDENTIFIER一位并忘记双引号。


我开始认为这不是 SQL Server,因为您在下面的评论中添加的“东西”肯定不是我所知道的 SQL……如果我尝试运行它,它不会做任何事情SSMS。

尝试这个:

DECLARE @test TABLE (error VARCHAR(MAX));
--Doesn't work due to single quotes
--INSERT INTO @test SELECT 'Violation of PRIMARY KEY constraint 'PK__AP__2EC21549E681BC94'. Cannot insert duplicate key in object 'dbo.Test'. The duplicate key value is (215009). The statement has been terminated.';
INSERT INTO @test SELECT 'Violation of PRIMARY KEY constraint ''PK__AP__2EC21549E681BC94''. Cannot insert duplicate key in object ''dbo.Test''. The duplicate key value is (215009). The statement has been terminated.';
SELECT * FROM @test;

推荐阅读