Неверный синтаксис рядом с ключевым словом 'current_timestamp' - но только в одной базе данных - PullRequest
3 голосов
/ 17 февраля 2012

У меня есть экземпляр SQL Server 2008 R2 с несколькими базами данных.

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

Я выполняю свой запрос так:

SELECT * FROM dbo.getAllStatusesForGridProjectsByMaximumDate(CURRENT_TIMESTAMP) 

, чтобы получить самую актуальную информацию.Однако вместо таблицы результатов SQL просто выводит сообщение об ошибке:

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'CURRENT_TIMESTAMP'.

Странно, однако, что если я запрыгиваю на другую базу данных (DB2) и запускаю функцию, обращаясь конкретно к серверу, он выполняет:

USE DB2
GO

SELECT * FROM DB1.dbo.getAllStatusesForGridProjectsByMaximumDate(CURRENT_TIMESTAMP) 

Это возвращает результаты.Однако если я попытаюсь выполнить запрос с DB1, он получит ту же самую ошибку неправильного синтаксиса:

USE DB1
GO

SELECT * FROM DB1.dbo.getAllStatusesForGridProjectsByMaximumDate(CURRENT_TIMESTAMP) 

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'CURRENT_TIMESTAMP'.

Я просмотрел базы данных, чтобы увидеть, есть ли какая-то настройка или свойство, которые япропустил, что позволило бы мне передать CURRENT_TIMESTAMP моей функции с табличным значением и ничего не нашел.Я попробовал явный CAST / CONVERT для CURRENT_TIMESTAMP, и ему там не нравятся какие-либо функции.

Какое колдовство было выполнено на моей DB2, что позволило бы ему запускать dbo.Function (Current_Timestamp)) что не было выполнено на DB1?Я буду продолжать проверять самостоятельно, но любая помощь, которую вы, замечательные люди, могли бы послать, будет принята с благодарностью.

1 Ответ

4 голосов
/ 17 февраля 2012

Проверьте уровень совместимости базы данных (не было на 100% ясно, если проблема возникала в DB1 или при вызове функции в DB1).

Могу поспорить, что уровень совместимости равен 80 в любой базе данныхдемонстрирует проблему;SQL Server 2000 не позволял таким образом передавать функции непосредственно в UDF (и у нас та же проблема, вызывая некоторые функции динамического управления, если уровень compat равен 80 - см. этот пост в блоге и комментарии ).Эта база данных должна быть восстановлена ​​или присоединена после резервного копирования или отсоединения от 2000. Или после обновления с 2000. Вы можете проверить текущую совместимость следующим образом:

SELECT name, compatibility_level FROM sys.databases WHERE name = 'DB1';

Если вы обнаружите, что это <100,Вы можете сказать: </p>

ALTER DATABASE DB1 SET COMPATIBILITY_LEVEL = 100;

Но вам следует делать это только в том случае, если вы знаете, что более низкая совместимость не нужна по какой-то другой причине - и вам следует проверить в тестовой системе, что база данных работает так, как ожидается в соответствии сновый уровень Compat.Если у вас есть проблемы, вы всегда можете вернуть их обратно, но лучше подготовиться.

Если вы не хотите связываться с уровнем совместимости, вы можете слегка изменить свою логику.

DECLARE @now DATETIME = CURRENT_TIMESTAMP;
SELECT * FROM dbo.getAllStatusesForGridProjectsByMaximumDate(@now);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...