Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在CONCAT语句中包含参数后,存储过程立即使用CONCAT函数截断变量_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

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

Sql 在CONCAT语句中包含参数后,存储过程立即使用CONCAT函数截断变量,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我正在尝试将参数[例如@X nvarchar(MAX)]传递到存储过程中的变量[例如@message nvarchar(MAX)]中。该变量使用CONCAT组合字符串值和变量,并最终成为从SQL Server发送的电子邮件正文和表中列的值。出于某种原因,当我设置变量时,CONCAT在第一个参数传递给它之后立即结束 另外一个细节是,当我手动运行存储过程时,它工作正常。在这种特殊情况下,仅当从外部应用程序调用存储过程时,才会出现此问题 我尝试了以下选项,但没有成功: 使用三个单引号设置不带CONC

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

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

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

  • 使用三个单引号设置不带CONCAT的变量
  • 将参数传递给@message变量之前的单独变量
  • 设置参数以允许输出到原始应用程序(即使原始应用程序不需要输出)
电子邮件发送正常,消息存储到[表],但在这两种情况下,
@message
变量在
@param
传递给它之后立即结束

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

Some text.
Value of param: paramTest
另外,param存储在[table]中,因此我知道该参数有一个有效值


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

检查作为参数值传递的内容

演示

返回

Some text.
Value of param: abc msg

我建议将消息视为一个字节序列。e、 g:

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显示为:0x610062000006300 式中:'a'=6100,'b'=6200,CHAR(0)=0000,'c'=6300。 因此,您可以“看到”字符(0)

unicode编码的背景信息:


我的第一个想法是@param值以NULL(或CHAR(0))结尾,导致SQL认为这是字符串的结尾。如果手动运行存储过程并运行ok,那么问题是如何从应用程序调用存储过程。您使用的是什么?“是否有一种方法可以捕获并查看从外部应用程序传递到存储过程的确切数据?”是的,它被称为SQL Profiler。我建议您尝试一下。该应用程序名为deviceWise,它从PLC上的a标记中提取参数。我已经看到,
字符串是以第一个空字符结尾的连续字符序列。
。在这种情况下,它是有意义的,因为中间有一个字符(0),它应该意味着NULL,然后意味着字符串的结尾。它的结尾可能还有另一个字符(0),但正如前面所说的,它在第一个空字符中终止,而不是最后一个字符。我今天终于能够检查数据了,并且参数在结尾与字符(0)一起传递。谢谢你的帮助!我明天会检查是否有字符(0)。谢谢你的建议!今天我终于能够检查数据了,并且在最后用CHAR(0)传递了参数。谢谢你的帮助!
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