Visual Studio считает неправильный синтаксис SQL

В Visual Studio 2013 я создал проект базы данных и импортировал существующую базу данных. Сначала все было хорошо, и проект был построен и создан, создавая сценарии.

Однако теперь Visual Studio кажется, что существуют синтаксические ошибки SQL, возвращая несколько ошибок SQL46010: Incorrect syntax near:. Все это из кода, созданного VS - я ничего не написал.

Пример 1:

ALTER ROLE [db_owner] ADD MEMBER [SomeUser];
SQL46010: Incorrect syntax near ADD.

Пример 2:

DECLARE @Foo NVARCHAR(7) = 'abcdefg';
SQL46010: Incorrect syntax near =.

Если я копирую/вставляю код в SSMS, все работает нормально.

К сожалению, это предотвращает создание проекта, а это значит, что я не могу публиковать. Поскольку они являются ошибками, а не предупреждениями, я не могу их игнорировать в настройках проекта.

Обходной путь существует, где я могу установить файлы проблем "Build Action to None", но мне нужно, чтобы эти файлы включались при публикации.

Я пробовал:

  • Удаление и повторное добавление одного и того же кода
  • Копирование/вставка кода в новый файл SQL
  • Закрытие и повторное открытие решения
  • Закрытие и повторное открытие Visual Studio
  • Обновление инструментов данных SQL Server SQL Server (SSDT) ​​
  • Обновление Visual Studio

Ближайшей проблемой, которую я смог найти, является этот поток MSDN с 2012 года, заявив, что есть ошибка SQL-анализатора SSDT (который запрашивал мне попробовать обновить SSDT).

Ответ 1

В свойствах проекта, называемых Target platform, указан параметр, который указывает VS, какую версию SQL Server проверяет на синтаксис.

Это относительно новые дополнения к синтаксису T-SQL, и они могут не работать, если синтаксис был установлен, например. SQL Server 2005.

Visual Studio 2013 database project settings

Ответ 2

Старый поток, но это меня выловило, поэтому я решил поделиться своим опытом, документация для ALTER ROLE, по-видимому, указывает на то, что она поддерживается в SQL 2008, когда на самом деле только часть функциональности. Вы можете использовать Alter Role для изменения имени роли i.e. ALTER ROLE [ROLE NAME] WITH [NEW ROLE NAME] Но для добавления или удаления членов из роли необходимо использовать старую (и теперь устаревшую) хранимую процедуру sp_addrolememeber i.e. sp_addrolemember 'Role Name', 'User Name'.
Как указывает Ааронинус, если вы настроите таргетинг на SQL 2012 или позже, это не будет отображаться как ошибка.

Ответ 3

чтобы установить флаг в проекте, действительно глупо, поскольку у меня есть ddl sql-скрипты в oracle и mssql внутри моего проекта класса С#.

Ответ 4

В моем случае я добавлял уже существующий сценарий после развертывания (файл .sql), щелкнув папку с именем "Справочные данные" ==> Добавить существующий элемент ==> Выбрать список файлов .sql, включая файл Script.PostDeployment1.sql. При нажатии F5 выдавалась следующая ошибка:

SQL46010: Неверный синтаксис рядом с:.

содержимое файла sql:

:r ".\Customer.data.sql"
GO

:r ".\Product.data.sql"
GO

:r ".\OrderType.data.sql"
GO

:r ".\Orders.data.sql"
GO

Решение: Сценарий после развертывания должен быть создан с использованием VS. В существующем проекте откройте Visual Studio и добавьте сценарий после развертывания, нажав: Добавить ==> Новый элемент ==> Сценарий ==> Сценарий после развертывания ==>. PostDeployment1.sql.After Для создания файла PostDeployment1.sql просто скопируйте и вставьте содержимое, а затем нажмите клавишу F5..PostDeployment1.sql должна выполняться без ошибок.