web-dev-qa-db-ja.com

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にコピーして貼り付けると、すべて正常に動作します。

残念ながら、これらはプロジェクトの構築を妨げます。つまり、公開できません。警告ではなくエラーであるため、プロジェクト設定で無視するように設定することはできません。

問題のファイルのビルドアクションを[なし]に設定できる回避策がありますが、公開するときにこれらのファイルを含める必要があります。

私が試した:

  • 同じコードを削除して再度追加する
  • コードを新しいSQLファイルにコピー/貼り付け
  • ソリューションを閉じて再び開く
  • Visual Studioを閉じて再度開く
  • Microsoft SQL Serverデータツール(SSDT)の更新
  • Visual Studioの更新

私が見つけた最も近い問題は このMSDNスレッド で、2012年から、バグSSDT SQLパーサーがあることを示しています(これによりSSDTの更新を試みるよう促されました)。

15
Aaroninus

Target platformというプロジェクトプロパティに、構文をチェックするSQL ServerのバージョンをVSに指示する設定があります。

これらはT-SQL構文への比較的新しい追加であり、構文が次のように設定されている場合は機能しない可能性があります。 SQL Server 2005。

Visual Studio 2013 database project settings

27
GSerg

古いスレッドですが、これは私を捕まえたので、私は私の経験を共有したいと思いました。ALTERROLEのドキュメントは、実際には機能の一部のみがSQL 2008でサポートされていることを示しているようです。あなたcanロールの変更を使用してロールの名前を変更するALTER ROLE [ROLE NAME] WITH [NEW ROLE NAME]ただし、ロールにメンバーを追加または削除するには、古い(そして現在は非推奨の)ストアドプロシージャsp_addrolememeber ieを使用する必要があります。 sp_addrolemember 'Role Name', 'User Name'
SQL 2012以降をターゲットにしているかどうかをAaroninusが指摘しているように、これはエラーとして報告されません。

1
Code Ranger

私の場合、「参照データ」という名前のフォルダをクリックして、既存の配置後スクリプト(.sqlファイル)を追加していました==>既存の項目を追加==> Script.PostDeployment1.sqlファイルを含む.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.PostDeployment1.sqlファイルを作成したら、コンテンツをコピーして貼り付け、F5キーを押します。PostDeployment1.sqlはエラーなしで正しく実行されます。

0
rafiquenazir

プロジェクトにフラグを設定する必要があるのは本当に愚かなことです。それは、c#クラスプロジェクト内のOracleとmssqlの両方にddl sqlスクリプトがあるからです。

0
Andreas