web-dev-qa-db-ja.com

SQL Serverのselectステートメントで変数を動的にせずにTOPで使用する

declare @top  int
set @top = 5
select top @top * from tablename

出来ますか?

または、そのようなロジックのアイデア(動的クエリを使用したくない)?

200
Paresh

はい。SQLServer 2005では、top句で変数を使用できます。

select top (@top) * from tablename
370
Guffa

SQL Server 2005では、変数、式、またはステートメントを使用して、実際にTOP句をパラメーター化できます。そのため、次のようなことができます。

SELECT TOP (@foo) a FROM table ORDER BY a 

SELECT TOP (SELECT COUNT(*) FROM somewhere else) a FROM table ORDER BY a 

SELECT TOP (@foo + 5 * 4 / 2) a FROM table ORDER BY a 

ソース

38
Espo

2005年以降、このスレッドにはいくつかの返信があるので、それを行うことができます。

あまり知られていないのは、SET ROWCOUNTを使用して2kでもこれを実現できることです。

  -- Works in all versions
  SELECT TOP 10

  -- Does not work on 2000
  SELECT TOP (10)
  SELECT TOP (@rows)

  -- Works in both 2ooo and 2oo5
  SET ROWCOUNT @max

  SELECT * 
  FROM ...

  SET ROWCOUNT 0

最後にSET ROWCOUNT 0を忘れると、制限が持続します。バグを見つけるのは非常に困難になります:-)

24
Brimstedt