gpt4 book ai didi

sql - 存储过程在 CONCAT 语句中包含参数后立即使用 CONCAT 函数截断变量

转载 作者:行者123 更新时间:2023-12-04 18:37:56 27 4
gpt4 key购买 nike

我正在尝试传递一个参数 [例如@X nvarchar(MAX)] 转换成变量 [例如@message nvarchar(MAX)] 在存储过程中。该变量使用 CONCAT 组合字符串值和变量,它最终成为从 SQL Server 发送的电子邮件的正文和表中列的值。出于某种原因,当我设置变量时, CONCAT 在第一个参数传递给它后立即结束。

一个额外的细节是当我手动运行存储过程时它工作正常。在这种特殊情况下,只有在从外部应用程序调用存储过程时才会出现此问题。

我尝试了以下选项但没有成功:

  • 使用三重单引号在没有 CONCAT 的情况下设置变量
  • 将参数传递给@message 变量之前的单独变量
  • 设置参数以允许 OUTPUT 到原始应用程序(即使原始应用程序不需要 OUTPUT)
ALTER PROCEDURE [dbo].[TEST] 
(@param NVARCHAR(MAX))
AS
BEGIN
SET NOCOUNT ON;

DECLARE @message NVARCHAR(MAX),
@email NVARCHAR(MAX)

SET @email = 'test@test.com'

SET @message = CONCAT ('Some text.',CHAR(13) + CHAR(10)
,'Value of param: ', @param, CHAR(13) + CHAR(10)
,'Some more text.');

INSERT INTO [database].[dbo].[table] ([Message], [Param])
VALUES (@message, @param);

EXEC msdb.dbo.sp_send_dbmail
@recipients = @email,
@body = @message,
@subject = 'SUBJECT OF EMAIL',
@profile_name = 'profile_name';

电子邮件发送正常,消息存储到 [table],但在这两种情况下,@message 变量在 @param 传递后立即结束给它。

例如,如果 @param 的值为“paramTest”,@message 将如下所示:

Some text.
Value of param: paramTest

此外,参数很好地存储到 [table],所以我知道参数具有有效值。

有没有办法捕获并查看从外部应用程序传递到存储过程的确切数据?我一直想知道它在分配参数时是否在数据末尾包含某种特殊字符。

最佳答案

我建议将消息​​视为字节序列。例如:

select *, cast([Message] as varbinary(max)) as DataAsBytes 
from [database].[dbo].[table]

这允许您查看所有字符的字节表示。

例子:

DECLARE @param NVARCHAR(MAX) = 'b' + CHAR(0); 
DECLARE @message NVARCHAR(MAX)
SET @message = CONCAT ('a', @param, 'c');
select @message as RawMessage, CAST(@message as varbinary(max)) as MessageAsBytes, LEN(@message) as RawMessageLength, DATALENGTH(CAST(@message as varbinary(max))) as NumBytes

在 SSMS 中运行时,将 RawMessage 显示为:ab,因此 CHAR(0) 字符导致 SSMS 不显示后面的“c”。MessageAsBytes 显示为:0x6100620000006300其中:“a”= 6100,“b”= 6200,CHAR(0) = 0000,“c”= 6300。所以你可以“看到” CHAR(0) 字符。

unicode 编码的背景信息:

https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses

关于sql - 存储过程在 CONCAT 语句中包含参数后立即使用 CONCAT 函数截断变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56548800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com