3

ADO.Net 経由で SQL Server 2005 バックエンドと通信する VB.Net フロント エンドを備えた .Net Web システムがあります。基本的に、私がやりたいことはこれです:

Dim command As SqlCommand = New SqlCommand("", connection)
command.CommandText = "SELECT * FROM someTable ORDER BY orderValue @SortOrder"
Dim sortParam As SqlParameter = New SqlParameter("@SortOrder", SqlDbType.varChar, 3)
sortParam.Value = "ASC"
command.Parameters.Add(sortParam)
command.Prepare()
reader = command.ExecuteReader()

並べ替え順序がクエリ文字列などを介して渡される場所。このコードは、「'@SortOrder' 付近の構文が正しくありません。ステートメントを準備できませんでした。」をスローします。

これは可能ですか、それとも私が見ていない本当にばかげた構文エラーがありますか?

(そして、はい、クライアントは .net 2.0 しか実行していないため、残念ながら LINQ ベースのソリューションは機能しません。

皆さんありがとう!

更新/応答:

まあ、それは私が思ったことです。皆さん、健全性チェックをありがとう。(一部のコンテキストでは、コマンド文字列は現在動的に構築されていますが、システムをより準備されたステートメントの方向に動かしています。これは、私が可能だとは知らなかったエッジケースの 1 つでした。

再度、感謝します!

4

8 に答える 8

5

いいえ、うまくいきません。

あなたがやろうとしていることをするために、頭のてっぺんから思いつくことができる2つの可能性があります。

  1. SQL 文字列を動的に構築する
  2. クエリからデータ テーブルを返し、ビューを使用して並べ替えを行います。

さらに 6 年ほどの経験 (および SQL Server のバージョン) があるので、これを達成する方法があります。

DECLARE @SortByIdASC AS INT;
SET @SortByIdASC = 1;
WITH cte AS (
SELECT Id, Foo, Bar
      , ROW_NUMBER() OVER (ORDER BY Id ASC) AS IdSortAsc
      , ROW_NUMBER() OVER (ORDER BY Id DESC) AS IdSortDesc 
   FROM MyTable
)

SELECT Id, Foo, Bar
   FROM cte 
   ORDER BY CASE WHEN @SortByIdASC = 1 THEN IdSortAsc
                 WHEN @SortByIdASC = 2 THEN IdSortDesc 
                 ELSE ''
                 END 
           , Foo, Bar 

これにより、指定された並べ替え順序から特定の列を上、下、または除外することもできます。

于 2009-01-21T21:17:41.770 に答える
2

並べ替えで使用される列を更新することは可能ですが。次の例を見てください。

declare @fname int,@lname int

select @fname=1,@lname=0

select * from [user]
order by case when @Fname=1 then firstname when @lname=1 then lastname end

この手法を使用して並べ替え順序を変更できるとは思いませんが、少なくとも並べ替え対象の列を変更することはできます。少なくとも、SQL 2005 の構文について苦情を受けようとすると

于 2009-01-21T21:25:59.757 に答える
2

既存の投稿と同様の方法でできます。

declare @firstSortField int, @secondSortField int
set @firstSortField = 1
set @secondSortField = 3

select firstName, lastName, phoneNumber
from customers
order by 
    case @firstSortField when 1 then firstName when 2 then lastName when 3 then phoneNumber else null end, 
    case @secondSortField when 1 then firstName when 2 then lastName when 3 then phoneNumber else null end
于 2009-01-21T21:37:06.177 に答える
1

私はそれが可能だとは思わない.パラメータ値だけを準備することができます.

于 2009-01-21T21:14:19.437 に答える
1

いいえ、毎回 SQL クエリに組み込む必要があります。または、並べ替え順序のサブセットがある場合は、これらのコマンド オブジェクトをキャッシュして、スイートとして再利用する必要があります。

ただし、質問に対する短い答えは「いいえ」です

于 2009-01-21T21:15:12.943 に答える
1

これはまさにあなたが求めたことを行い、ユーザーが入力した文字列をデータベースの近くに配置することはありません。

//クエリ文字列から要求された注文を取得します
string sortOrderRequest = request["SortOrder"].ToUpper();
文字列 sortParam = "";
if ( sortOrderRequest.Equals("ASC"))
  sortParam = " ordervalue ASC による順序 ";
else if (sortOrderRequest.Equals("DESC"))
  sortParam = " ordervalue DESC による順序 ";

Dim command As SqlCommand = New SqlCommand("", connection)
command.CommandText = "SELECT * FROM someTable" + sortParam;
コマンド.準備()
リーダー = command.ExecuteReader()
于 2009-05-28T16:43:47.547 に答える
1

確かにできます。SortASC と SortDESC という 2 つのエイリアス列を作成し、これらに必要なものを入力して並べ替えます。

-- Testcase setup
DECLARE @OrderASC bit
SET @OrderASC = 0

-- Statement required
SELECT
    Users.*,
    CASE @OrderASC WHEN 1 THEN Users.Alias ELSE null END AS _SortASC,
    CASE @OrderASC WHEN 0 THEN Users.Alias ELSE null END AS _SortDESC
FROM Users
ORDER BY _SortASC, _SortDESC DESC
于 2009-05-28T16:50:07.627 に答える