«CONCAT» не является распознанным именем встроенной функции

24

Клиент сообщил, что он работает на SQL Server 2012, и мы передали несколько тестовых запросов для тестирования до окончательной доставки:

«CONCAT» не является распознанным именем встроенной функции.

Я понимаю, что CONCAT()это новая встроенная функция, представленная в SQL Server 2012, и все в порядке, но меня попросили откатить изменения, чтобы сделать этот 2008R2 совместимым под видом «пользователь, выполняющий запрос, может не иметь разрешения Transact-SQL для выполнения. " Так что я просто доказываю, что клиент, скорее всего, имеет другую версию SQL Server, установленную в DEV, чем в PROD.

Я не могу найти никакой информации о конкретном отказе в SELECT/EXECUTEразрешениях для встроенных скалярных функций, но возможно ли это, и если да, то получает ли пользователь тот же текст ошибки?

beeks
источник
Если concat не работает, попробуйте этотSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi
CONCAT поддерживает десятичный тип concat (ID + '_' + OtherID), ID может быть типом int.
Чжан
В старых версиях используйте это вместо:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Джек Уиттакер

Ответы:

21

CONCATбыл введен в SQL Server 2012; нет способа заставить его работать в SQL Server 2008 R2. Из документации :

введите описание изображения здесь

Также нет способа заставить его выйти из строя в 2012+, даже с уровнем совместимости. Так пусть ваши люди проверят SELECT @@VERSION;на обоих серверах; вы обнаружите, что там, где происходит CONCATсбой, он составляет <11. Чтобы сделать ваш код совместимым с более ранними версиями, вам нужно использовать стандартный оператор конкатенации строк ( +). Я не знаю , как вы могли бы сделать это с помощью скалярной функции, если вы всегда использовали точное такое же количество входных строк и изменить код , чтобы использовать dbo.CONCAT()вместо CONCAT()(там будет сценарии , где это имеет значение, а также , если ваша функция ничего не делает нативный не делает, вы хотите последовательное поведение, если / когда вы обновляете). Поэтому я бы не рекомендовал такой подход. Вам также может понадобиться добавитьNULL обработка и другие незначительные изменения (невозможно сказать, как точно изменить существующий скрипт, если мы его не видим).

Аарон Бертран
источник
Спасибо, Аарон. Изменять код тривиально, так как CONCAT () просто используется для объединения некоторых строк перед динамическим вызовом SQL SP_ExecuteSQL. Я действительно просто хотел подтвердить, что не было никакого способа запретить доступ к использованию CONCAT () в SQL Server 2012
beeks
1
@beeks Я не знаю ни одного способа запретить пользователям использовать CONCAT(), нет. Я не совсем понимаю, какое отношение это имеет к тому, что вам нужно сделать, чтобы заставить код работать на 2008 R2, хотя. Вы должны удалить CONCAT() , а не добавить его.
Аарон Бертран
1
да, я понимаю, как сделать код совместимым с 2008 R2, это тривиально. Спасибо за подтверждение, что никто не может DENYполучить доступ к этой функции.
Beeks
Просто обратите внимание, что при изменении значения concat на + вам необходимо убедиться, что объединяемые значения являются строками, если у вас есть числовые поля, они попытаются добавить их (и потерпят неудачу, поскольку строка не является целым числом), поэтому если есть числовое поле (тип), убедитесь, что вы сначала конвертируете / приводите его к строке
Ste Bov
3

Вы можете использовать функцию ODBC CONCAT следующим образом:

SELECT {fn CONCAT('foo ', 'test') }

Проблема в том, что эта функция позволяет вам одновременно использовать только два параметра. Так что, если вы не хотите использовать более двух, как это:

SELECT {fn CONCAT('foo ', {fn CONCAT('test ', 'buddy')}) }

Вы можете также использовать оператор «+».

базовое обеспечение главнокомандующего нато на атлантике
источник