2

このコード:

USE [db]
GO
/****** Object:  UserDefinedFunction [dbo].[GetFieldPickerReports]    Script Date: 01/11/2013 19:12:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER  FUNCTION [dbo].[GetFieldPickerReports] (@CustomerName  varchar(100))
RETURNS TABLE
AS 
  RETURN SELECT [fpr].[ID], [fpr].[Name], [fpr].[Global], [fpr].[FPRCategoryID]
  FROM FieldPickerReport fpr, dbo.GetProductKeyIdByCustomer(@CustomerName) pk 
  LEFT JOIN [FPRCategory] fprcat on ([fpr].[FPRCategoryID]=[fprcat].[ID])
  WHERE [Global]=1 OR ProductKeyID=pk.id

エラーが発生します:

マルチパート識別子「fpr.FPRCategoryID」をバインドできませんでした。

このクエリは、(現在追加する必要がある)なしで、またはと句Left Joinを削除して機能します。dbo.GetProductKeyIdByCustomer()Where

これがのコードですdbo.GetProductKeyIdByCustomer()

USE [db]
GO
/****** Object:  UserDefinedFunction [dbo].[GetProductKeyIdByCustomer]    Script Date: 01/11/2013 19:58:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER  FUNCTION [dbo].[GetProductKeyIdByCustomer] (@CustomerName  varchar(100))
RETURNS TABLE
AS
   RETURN SELECT id
   FROM ProductKey
   WHERE [CustomerName]=@CustomerName AND Enabled=1

私のクエリの何が問題になっていますか?

4

1 に答える 1

3

まず、これらの UDF はビューとして実装する方がよいと思います。

次に、暗黙的な結合と明示的な結合を混在させています。すべての明示的な結合を使用すると、問題が解決するはずです:

SELECT 
    [fpr].[ID], 
    [fpr].[Name], 
    [fpr].[Global], 
    [fpr].[FPRCategoryID]
FROM 
    FieldPickerReport fpr
    JOIN dbo.GetProductKeyIdByCustomer(@CustomerName) pk 
        ON [Global] = 1 OR ProductKeyID = pk.id
    LEFT JOIN FPRCategory fprcat 
        ON fpr.FPRCategoryID = fprcat.ID
于 2013-01-11T18:06:28.810 に答える