我在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
)
答案 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的问题。