"CONCAT" не є розпізнаваною вбудованою назвою функції


24

Клієнт повідомив, що вони працюють на SQL Server 2012, і ми доставили кілька тестових запитів для тестування до остаточної доставки:

"CONCAT" не є розпізнаваною вбудованою назвою функції.

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

Я не можу знайти будь-яку інформацію про конкретно відхилення SELECT/EXECUTEдозволів для вбудованих скалярних функцій, але чи можливо це, і якщо так, користувач все ще отримує той самий текст помилки?


Якщо 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;
Jack Whittaker

Відповіді:


21

CONCATбула представлена ​​в SQL Server 2012; немає можливості змусити його працювати в SQL Server 2008 R2. З документації :

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

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


Спасибі, Аарон. Код банально змінювати, оскільки CONCAT () просто використовується для об'єднання деяких рядків разом перед тим, як викликати динамічний SQL SP_ExecuteSQL. Я дійсно хотів підтвердити, що в SQL Server 2012 немає можливості заборонити доступ до використання CONCAT ()
beks

1
@beeks Я не знаю жодного способу відмовити користувачам у користуванні CONCAT(), ні. Я не зовсім розумію, що стосується того, що потрібно зробити, щоб код працював на R2 2008 року. Вам потрібно видалити CONCAT() , а не додати його.
Аарон Бертран

1
так, я розумію, як зробити код сумісним з R2 2008 року, що є тривіальним. Дякуємо, що підтвердили, що не можете DENYотримати доступ до цієї функції.
beks

Зауважимо лише, що при зміні concat на + вам потрібно буде забезпечити об'єднання значень - це рядки для початку, якщо у вас є чисельні поля, він спробує додати їх (і не вдасться, тому що рядок не є int), так що якщо є числове поле (тип), переконайтеся, що ви перетворили / передали його в рядок спочатку
Ste Bov

3

Ви можете використовувати функцію ODBC CONCAT так:

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

Проблема в цьому полягає в тому, що ця функція дозволяє вам одночасно два параметри. Тож якщо ви не хочете використовувати більше двох таких:

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

Ви також можете просто скористатися оператором "+".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.