2

我有这个用于创建过程的 SQL:

create procedure [dbo].[spGetProduct](@col_sort varchar(100), @dir_sort varchar(4), @filters nvarchar(max)) as
begin
declare @temp table (
        row_num int,
        product_id int,
        product_name nvarchar(255),
        produnit_name nvarchar(50)
    )

insert into @temp
    EXEC('select * from (select (ROW_NUMBER() OVER (ORDER BY '+@col_sort+' '+@dir_sort+')) row_num, product_id, product_name, dbo.fnGetUnitName(ing_produnit) produnit_name
     from dbo.Products
     where '+@filters+') as tmp)

select * from @temp
end

信息:

dir_sort可以是ascdesc并且col_sort是包含列名之一的字符串。

在这种情况下,过滤器是无关紧要的。

什么时候col_sort有值product_id或者product_name它工作正常,但是当我用它调用它时produnit_name会抛出错误。

在这种情况下,如何按该列对数据进行排序?

编辑:

错误是:

列名“produnit_name”无效。

4

2 回答 2

1

那是因为produnit_name是派生列。虽然您可以在 ORDER BY 子句中使用派生列,但不能将其与ROW_NUMBER OVER.

于 2013-03-26T13:08:58.150 回答
1

您不能OVER()在同一范围内引用子句中的别名,因为别名是在评估子句之后定义的。OVER()这与您不能GROUP BY alias或不能说的原因相同WHERE alias = 1——在这些情况下,别名也尚未定义。

如果您不能使用连接而不是函数来派生单元名称,那么您将不得不再次嵌套,例如

insert into @temp
EXEC('select * from (select (ROW_NUMBER() OVER 
  (ORDER BY '+@col_sort+' '+@dir_sort+')) row_num, * FROM 
    (SELECT product_id, product_name, 
      dbo.fnGetUnitName(ing_produnit) produnit_name
      from dbo.Products
      where '+@filters+') AS x) as tmp');
于 2013-03-26T13:09:23.437 回答