2

デプロイメントの制限により、プロジェクトで同義語を使用できないため、代わりに次のビューを作成しました。

CREATE VIEW [dbo].[User] AS SELECT * FROM [PersonalData].[dbo].[User] 
GO

問題なく動作しましたが、次のように変更する必要があります。

ALTER VIEW [dbo].[User] AS 
    SELECT [Id],
    t.[Name] AS [Title],
    [FirstName],
    [LastName],
    [JobTitle],
    [Department],
    [EmailAddress],
    [PhoneNumber],
    [PhoneExtension],
    [MobilePhoneNumber],
    [CreatedDate],
    [ModifiedDate],
    [Uid],
    [Active]
    FROM [PersonalData].[dbo].[User] AS u
    LEFT OUTER JOIN [PersonalData].[dbo].[Titles] AS t ON u.TitleId = t.Id 
GO

現在、次のエラーで失敗します。

Ambiguous column name 'Id'

行でLEFT OUTER JOIN

ただし、Microsoft SQL Management Studio では[PersonalData].[dbo].[Titles]次のエラーが強調表示されます。

Invalid object name '[PersonalData].[dbo].[Titles]

実際、そのテーブルの列の IntelliSense は提供されません。

テーブル[PersonalData].[dbo].[Titles]はそこにあります。実際、次のクエリはエラーなしで結果を返します。

select * from [PersonalData].[dbo].[Titles]

SQL に関する私の知識は十分ではありませんが、これがなぜなのか、なぜUserstable は見つかるのに が見つからないのか理解できませんTitles

もう少しコンテキスト:

  • 私が作成しているビューは、データベースではなく、 というPersonalData別のデータベースにありますPlatform
  • コンテキストを確認しましたが、問題ありませんPlatform。データベースにビューを作成しています。

なぜそれが起こるのですか?

4

3 に答える 3

6

IntelliSense の問題は周辺的なものであり、次のことが原因である可能性があります。

  1. 以前の構文エラー (両方のテーブルに存在するため、意味するものを SQL Server に伝える必要があります) またはId
  2. ローカルの IntelliSense キャッシュが古くなっていることを確認してください。Ctrl+ Shift+を発行するRか、または使用することでこれを修正できますEdit > IntelliSense > Refresh Local Cache(そして、サーバーへのネットワーク接続に応じて、数秒または数分も待機します)。

とはいえ、私は 2 つの変更を提案します。1 つは深刻なもので、もう 1 つは単なるベスト プラクティスです。

  1. 列に名前を付けないでくださいId。名前は完全に無意味です。それはUserIDですか?UserIDわかりました、スキーマに表示される場所ならどこでも呼び出します。
  2. 名前の競合がある列だけでなく、クエリ内のすべての列に適切なプレフィックスを付けます。これにより、クエリが理解しやすくなり、列がどのテーブルから来ているかを手動で把握する必要がなくなります。
于 2013-03-05T20:10:20.457 に答える
3

フィールドにテーブル名を追加する必要があります[id]。そのフィールドは両方のテーブルにあるため、あいまいであると見なされます(ビューはどちらのテーブルから取得するかを認識していません)。

SELECT u.[Id] AS [id] 
于 2013-03-05T19:56:38.953 に答える
1

試す

ALTER VIEW [dbo].[User] AS 
    SELECT u.[Id],

User テーブルと Titles タブの両方に「Id」という名前の列があるようです。SELECT 列リストでどの Id 列を意味するかわからないことを示しています。

于 2013-03-05T19:19:10.570 に答える