2013-08-02 32 views
3

我使用SQL Server 2008中我的程序是ROW_NUMBER與參數

SELECT ContractorID , 
     Name, 
     ROW_NUMBER() OVER (ORDER BY ContractorID) as RowNumber 
FROM dbo.Contractor 

這是工作,但現在我想參數傳遞到OVER功能。

我曾嘗試:

DECLARE @OrderBy VARCHAR(MAX) 
SET @OrderBy = 'ORDER BY ContractorID' 

SELECT ContractorID , 
     Name, 
     ROW_NUMBER() OVER (@OrderBy) as RowNumber 
FROM dbo.Contractor 

這使錯誤 '@OrderBy附近的語法不正確'?我怎樣才能做到這一點?謝謝。

+3

http://msdn.microsoft.com/en-us/library/aa905910 (v = sql.80).aspx –

+0

您無法在T-SQL中對列(或表)名稱或其他關鍵字進行參數化。就像你不希望在C#中能夠通過使用字符串中的名稱來調用一個函數一樣(是的,你可以使用Reflection,但它不僅僅是一個擁有字符串並且奇蹟般地期待它的例子以調用該函數) –

回答

4

你可能有一個動態的SQL,然後執行它

DECLARE @OrderBy VARCHAR(MAX) 
SET @OrderBy = 'ORDER BY ContractorID' 
DECLARE @SQL VARCHAR(MAX) 
SET @SQL = 
'SELECT ContractorID , 
     Name, 
     ROW_NUMBER() OVER (' + @OrderBy + ') as RowNumber 
FROM dbo.Contractor ' 

EXEC (@SQL) 
+0

最後的語法稍微錯誤。它應該是'EXEC(@SQL)'(括號非常重要)。或者,它可能就像在@ Devart的答案中一樣。 –

+0

@AndriyM感謝您的糾正。我添加了括號。 –

4

嘗試這一個 -

DECLARE @OrderBy VARCHAR(MAX) 
SET @OrderBy = 'ORDER BY ContractorID' 

DECLARE @SQL NVARCHAR(MAX) 
SELECT @SQL = 'SELECT ContractorID , 
     Name, 
     ROW_NUMBER() OVER (' + @OrderBy + ') as RowNumber 
FROM dbo.Contractor' 

PRINT @SQL 
EXEC sys.sp_executesql @SQL 
-1

爲什麼不試試這個..

DECLARE @OrderBy VARCHAR(MAX) 
SET @OrderBy = 'ContractorID' 

SELECT ContractorID , 
     Name, 
     ROW_NUMBER() OVER (order by @OrderBy) as RowNumber 
FROM dbo.Contractor 

希望這有助於..

+2

這將基本上將包含'ContractorID''相同字面值的列添加到所有行,然後按順序排序。由於字符串在所有行中都是相同的,因此產生的ORDER BY將是任意的。 –