SQL 服务器:Concat 中途停止

SQL Server: Concat stopping partway through

我正在为经常重复的标量函数构建一些动态 SQL 生成器,我 运行 遇到了 CONCAT 的问题:即它在操作中途停止,并且 returns 是一个不完整(截断的)字符串值。

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

我在底线上添加了注释,准确显示了截断 return 值的位置。

这是数据类型差异吗?
我尝试手动将一些字符串转换为 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' */

下面是即时截图window:

试试这个:

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'

这是 SSMS 中调试 windows 的限制(即时、监视等)
调试 windows 似乎有字符限制,它们会截断较长的字符串。

如果您 PRINT @SQL 您应该看到整个连接的字符串。