Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 执行存储过程时显示多部分标识符错误_Sql Server - Fatal编程技术网

Sql server 执行存储过程时显示多部分标识符错误

Sql server 执行存储过程时显示多部分标识符错误,sql-server,Sql Server,我有这样一个存储过程: 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

我有这样一个存储过程:

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  
执行时,我遇到如下错误:

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


如何解决此问题?

非常简单。外部查询没有从lL表中选择任何内容。你只在和locid中使用它。。。子查询。您不能在父查询中使用该子查询中的任何字段,但“一个l.locid”字段除外,并且只能在in。。。比较。

要获取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\u tbl与Transaction\u tbl on LocId列连接起来。

sir,,如何重新编写此查询我希望以升序获取locname。因此,我必须按以下方式给出order BY的位置:“+@startdate+”和“+enddate+”之间的dtime orderby l.locname但获取错误:order BY子句在视图、内联函数和派生表中无效