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_sortascまたはdescでありcol_sort、列名の1つを含む文字列です。

この場合のフィルターは関係ありません。

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 aliasWHERE 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 に答える