-3

次のようなストアド プロシージャがあります。

ALTER PROCEDURE [dbo].[ParkingDeatailsReportnew] 
 @startdate NVARCHAR(100),
  @enddate NVARCHAR(100)AS BEGINDECLARE  @cols AS NVARCHAR(MAX) , @query AS NVARCHAR(MAX)
 SELECT @cols = STUFF((  SELECT DISTINCT ',' + QUOTENAME(Vtype)
  FROM dbo.VType_tbl FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
 SET @query =
    'SELECT  LocName,Date, ' + @cols + '
     from  ( 
            select  l.LocName,v.Vtype, convert(date, dtime) as Date 
            from Transaction_tbl t 
            join VType_tbl v on t.vtid = v.vtid 
where dtime between ''' + @startdate + ''' and ''' + @enddate + ''' 
                and locid IN (SELECT l.Locid FROM dbo.Location_tbl l)
    ) d pivot ( count(Vtype) for Vtype in (' + @cols + ')  ) p '  
EXEC sys.sp_executesql @query
END  

実行中に次のようなエラーが発生します。

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

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

0

locname を取得するには、サブクエリを使用する代わりに、結合でテーブル名を使用します。サンプルは次のとおりです。

ALTER PROCEDURE [dbo].[ParkingDeatailsReportnew] 
 @startdate NVARCHAR(100),
  @enddate NVARCHAR(100)AS BEGINDECLARE  @cols AS NVARCHAR(MAX) , @query AS NVARCHAR(MAX)
 SELECT @cols = STUFF((  SELECT DISTINCT ',' + QUOTENAME(Vtype)
  FROM dbo.VType_tbl FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
 SET @query =
    'SELECT  LocName,Date, ' + @cols + '
     from  ( 
            select  l.LocName,v.Vtype, convert(date, dtime) as Date 
            from Transaction_tbl t 
            join VType_tbl v on t.vtid = v.vtid 
            join dbo.Location_tbl l on t.locid=l.Locid
where dtime between ''' + @startdate + ''' and ''' + @enddate + ''' 
                    ) d pivot ( count(Vtype) for Vtype in (' + @cols + ')  ) p '  
EXEC sys.sp_executesql @query
END  

ここでは、サブクエリを削除し、Location_tbl を LocId 列の Transaction_tbl に結合しました。

于 2013-08-06T15:48:24.897 に答える
0

とてもシンプルです。l外部クエリはL テーブルから何も選択していません。and locid IN (...)サブクエリでのみ使用しています。親クエリでそのサブクエリの ANY フィールドを使用することはできません。1 つのフィールドを除いて、比較l.locid内でのみ使用できます。IN (...)

于 2013-08-06T15:45:19.953 に答える