SQL Server: Concat останавливается на полпути - PullRequest
0 голосов
/ 12 октября 2018

Я строю некоторые динамические генераторы SQL для часто дублирующихся скалярных функций, и у меня возникает проблема с CONCAT, а именно: он останавливается на полпути во время операции и возвращает неполное (усеченное) строковое значение.

(я пробовал с операторами + и CONCAT вызовами функций, в любом случае одинаковые результаты.)

Я поместил комментарий в нижней строке, показывая, где именно оно усекает возвращаемое значение.

Это несоответствие типов данных?
Я попытался вручную привести некоторые строки к NVARCHAR ( 4000 ), но это ничего не изменило.
Я также попытался использовать NVARCHAR ( MAX ), ноопять же, это не имело никакого значения для результата.

В этом примере @FunctionName и @DescriptivePKColumnName оба NVARCHAR ( 48 ) и не являются нулевыми или пустыми.

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 голосов
/ 13 октября 2018

Это ограничение окон отладки в SSMS (немедленное, наблюдение и т. Д.)
Кажется, что окна отладки имеют ограничение по количеству символов, и они усекают более длинные строки.

Если вы PRINT @SQL вы должны увидеть всю сцепленную строку.

0 голосов
/ 12 октября 2018

Попробуйте это:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...