ALTER proc [dbo].[proc_Select_File]
@columnName varchar(30), --是种类的列,多个就用','塥开
@beforeTime varchar(60), --前面时间
@afterTime varchar(60), --后面时间
@compositorColumn varchar(30), --排序列
@brforeRange int, --前面的筛选(数量或金额)
@afterRange int, --后面的筛选(数量或金额)
@ascOrDesc varchar(30) --排序方式
as
declare @sql nvarchar(max)
set @sql='
with newTable as 
(
 select '+@columnName+',sum(Amount),sum(Amount*Price) from dbo.vw_Order_Item 
 where OrderID in 
 (
select OrderID from dbo.tb_Orders where StatusID=2
 )
     and SaleDate between '+''''+@beforeTime+''''+' and '+''''+@afterTime+''''+'
     group by '+@columnName+'
     having '+@compositorColumn+' between '+Convert(varchar(30),@brforeRange)+' and '+Convert(varchar(30),@afterRange)+' --范围的限定
     order by '+@compositorColumn+' '+@ascOrDesc+'  --排序列与排序方式 

select count(1) from newTable
'
exec sp_executeSQL @sql
我用以下数据来执行exec proc_Select_File 
@columnName='BrandName,SaleDate',
@beforeTime='1999-12-20',
@afterTime='2009-12-20',
@compositorColumn='sum(Amount)',
@brforeRange=1,
@afterRange=50,
@ascOrDesc='asc'

解决方案 »

  1.   

    看看是不是这里 between '+Convert(varchar(30),@brforeRange)+' and '+Convert(varchar(30),@afterRange)+'
    => between '''+Convert(varchar(30),@brforeRange)+''' and '''+Convert(varchar(30),@afterRange)+'''
      

  2.   

    看错...
    在exec sp_executeSQL @sql 之前print @sql 然后在查询分析器里分析看看
      

  3.   


    ALTER proc [dbo].[proc_Select_File]
    @columnName varchar(30), --是种类的列,多个就用','塥开
    @beforeTime varchar(60), --前面时间
    @afterTime varchar(60), --后面时间
    @compositorColumn varchar(30), --排序列
    @brforeRange int, --前面的筛选(数量或金额)
    @afterRange int, --后面的筛选(数量或金额)
    @ascOrDesc varchar(30) --排序方式
    as
    declare @sql nvarchar(max)
    set @sql='
    with newTable as 
    (
         select '+@columnName+',sum(Amount),sum(Amount*Price) from dbo.vw_Order_Item 
         where OrderID in 
         (
            select OrderID from dbo.tb_Orders where StatusID=2
         )
         and SaleDate between '+''''+@beforeTime+''''+' and '+''''+@afterTime+''''+'
         group by '+@columnName+'
         having '+@compositorColumn+' between '+Convert(varchar(30),@brforeRange)+' and '+Convert(varchar(30),@afterRange)+' --范围的限定
        order by '+@compositorColumn+' '+@ascOrDesc+'  --排序列与排序方式 

    select count(1) from newTable
    '
    PRINT @sql
    exec sp_executeSQL @sql
      

  4.   

    输出with newTable as 
    (
     select BrandName,SaleDate,sum(Amount),sum(Amount*Price) from dbo.vw_Order_Item 
     where OrderID in 
     (
    select OrderID from dbo.tb_Orders where StatusID=2
     )
         and SaleDate between '1999-12-20' and '2009-12-20'
         group by BrandName,SaleDate
         having sum(Amount) between 1 and 50 --范围的限定
         order by sum(Amount) asc  --排序列与排序方式 

    select count(1) from newTable
      

  5.   

    消息 1033,级别 15,状态 1,第 12 行
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
      

  6.   

    去掉order by sum(Amount) asc  --排序列与排序方式 
    select * from newTable order by Amount asc
      

  7.   

    还是不行,其实我这里可以直接不要order by sum(Amount) asc  这个的,因为我现在只要临时表里面的行数报错内容:消息 8155,级别 16,状态 2,第 2 行
    没有为 'newTable' 的列 3 指定任何列。
    消息 8155,级别 16,状态 2,第 2 行
    没有为 'newTable' 的列 4 指定任何列。
      

  8.   

    前面加 select top 100 percentALTER proc [dbo].[proc_Select_File]
    @columnName varchar(30), --是种类的列,多个就用','塥开
    @beforeTime varchar(60), --前面时间
    @afterTime varchar(60), --后面时间
    @compositorColumn varchar(30), --排序列
    @brforeRange int, --前面的筛选(数量或金额)
    @afterRange int, --后面的筛选(数量或金额)
    @ascOrDesc varchar(30) --排序方式
    as
    declare @sql nvarchar(max)
    set @sql='
    with newTable as 
    (
         select top 100 percent '+@columnName+',sum(Amount),sum(Amount*Price) from dbo.vw_Order_Item 
         where OrderID in 
         (
            select OrderID from dbo.tb_Orders where StatusID=2
         )
         and SaleDate between '+''''+@beforeTime+''''+' and '+''''+@afterTime+''''+'
         group by '+@columnName+'
         having '+@compositorColumn+' between '+Convert(varchar(30),@brforeRange)+' and '+Convert(varchar(30),@afterRange)+' --范围的限定
         order by '+@compositorColumn+' '+@ascOrDesc+'  --排序列与排序方式 

    select count(1) from newTable
    '
    exec sp_executeSQL @sql
      

  9.   

    如果只是要行数,完全可以不加order by,加了还效率低
      

  10.   

    还是不行,还是报这个错消息 8155,级别 16,状态 2,第 2 行
    没有为 'newTable' 的列 3 指定任何列。
    消息 8155,级别 16,状态 2,第 2 行
    没有为 'newTable' 的列 4 指定任何列。
      

  11.   

    select top 100 percent '+@columnName+',sum(Amount) AS Amount,sum(Amount*Price) AS total from dbo.vw_Order_Item
      

  12.   

    没有表没有数据,我这里也不好调试.
    sum(Amount),sum(Amount*Price) 这两个没有赋列名...改为上面的
      

  13.   

    谢谢,可以了,给你分之前你可以说说为什么要加top 100 percent 这个吗?
      

  14.   

    看错误提示信息.
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。 
    所以加上TOP, TOP 100 PERCENT 也是返回全部数据
      

  15.   

    如果按照你这样说的话,TOP 100 PERCENT 也是返回全部数据,那么我不写上去不是也一样的吗???
      

  16.   

    这个是SQL规定的...
    举个简单的例子吧--这句失败
    SELECT * FROM (SELECT * FROM sys.tables ORDER BY name)x
    --这句成功
    SELECT * FROM (SELECT TOP 100 PERCENT * FROM sys.tables ORDER BY name)x
      

  17.   


    SELECT * FROM (SELECT TOP 100 PERCENT * FROM sys.tables ORDER BY name)这个SELECT * FROM 没有表名都可以查询的?
      

  18.   

    先ding下。不过lx,你的存储过程写的欠规范呀,比如参数@brforeRange,应该写成@beforeRange,alter+proc+存储过程名可以写成create+proc+存储过程名