SQL Server:Concat在途中停止

时间:2018-10-12 18:54:58

标签: sql sql-server types concatenation sql-server-2017

我正在为频繁重复的标量函数构建一些动态SQL生成器,而我遇到了CONCAT的问题:即,它在操作过程中停止,并返回了不完整的(截断的)字符串值

(我尝试使用+运算符和CONCAT函数调用,两种方法的结果相同。)

我在底行添加了一条注释,准确显示了截断返回值的位置。

这是数据类型差异吗?
我尝试将一些字符串手动强制转换为NVARCHAR ( 4000 ),但它没有任何改变。
我也尝试使用NVARCHAR ( MAX ),但同样对结果没有影响。

在此示例中,@FunctionName@DescriptivePKColumnName均为NVARCHAR ( 48 ),并且不为null或为空。

DECLARE @SQL NVARCHAR ( 4000 ) =
    IIF ( EXISTS ( SELECT 1    /* CREATE vs ALTER, does the function already exist? */
                   FROM   [sys].[objects]
                   WHERE  [object_id] = OBJECT_ID ( N'[dbo].[' + @FunctionName + N']' ) ) ,
N'ALTER' , N'CREATE' ) + N' FUNCTION [dbo].[' + @FunctionName + N']    /* so far so good */
(
    @' + @DescriptivePKColumnName + N'Param TINYINT NOT NULL    /* final + gets hung up */
)
RETURNS NVARCHAR ( 48 )
WITH NATIVE_COMPILATION ,
     SCHEMABINDING
AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT     ,
                       LANGUAGE                    = N''English'' )
    RETURN' ;     /* Concat ends prematurely with '= N''Engli' */

这是即时窗口的屏幕截图: enter image description here

2 个答案:

答案 0 :(得分:1)

尝试一下:

DECLARE @SQL NVARCHAR(4000)
DECLARE @FunctionName NVARCHAR(255) = 'dbo.test'
DECLARE @DescriptivePKColumnName  NVARCHAR(255) = 'Column1'

IF EXISTS
(
    SELECT 1    
    FROM [sys].[objects]
    WHERE [object_id] = OBJECT_ID(@FunctionName)
)
BEGIN
    set @SQL = 'ALTER'
END
ELSE
BEGIN
    set @SQL = 'CREATE'
END

SET @SQL += ' FUNCTION ' + @FunctionName + '(@' + @DescriptivePKColumnName +'Param  TINYINT)
    RETURNS NVARCHAR(48)
WITH NATIVE_COMPILATION , SCHEMABINDING
AS 
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT,LANGUAGE = N''English'' )
    RETURN
END'

答案 1 :(得分:0)

这是SSMS中调试窗口的限制(即时,监视等)。
调试窗口似乎有一个字符限制,并且它们会截断更长的字符串。

如果您PRINT @SQL,应该会看到整个串联的字符串。