太长。最大长度为128。同时使用双引号

时间:2018-08-03 09:28:05

标签: sql-server stored-procedures sql-insert

我在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
) 

3 个答案:

答案 0 :(得分:1)

在查询中替换:

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;

答案 1 :(得分:0)

如果该列不支持字符串,那么您将需要alter TestLog table并增加被截断的列的大小。您可以在此处了解如何在MS SQL中更改表:

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-2017

您需要从更改参数

@ERROR nvarchar(4000)

@ERROR nvarchar(MAX)

此外,您需要查看错误消息中的字符数并采取相应措施。

而且,您还需要确保引号正确转义。

答案 2 :(得分:0)

我找到了一个解决方案:我必须在执行SP之前使用SET QUOTED_IDENTIFIER OFF来执行SP,在我的SP中必须将SET QUOTED_IDENTIFIER OFF来执行,但是每次执行SP时都必须执行。 (SP在软件中执行。)

示例:

SET QUOTED_IDENTIFIER OFF
Exec [TestLog]
@PrimaryName = "test"
,@ERROR = "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."

然后我将避免出现128 len的问题。