首页 > 解决方案 > SQL Server:Concat 中途停止

问题描述

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

(我尝试过使用 + 运算符和CONCAT函数调用,结果都一样。)

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

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

在此示例中,@FunctionNameand@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' */

这是即时窗口的屏幕截图: 在此处输入图像描述

标签: sqlsql-servertypesconcatenationsql-server-2017

解决方案


尝试这个:

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'

推荐阅读