2014-10-02 233 views
0

當我運行以下代碼時,出現錯誤:'@num_to_remove'附近的語法錯誤。如何在Select語句中使用變量?

任何想法,爲什麼這不起作用?

由於提前, 馬特

DECLARE @num_to_remove INT 
SET @num_to_remove = 2 

-- get em_ids for records to delete 
WITH em_ids 
AS (SELECT TOP @num_to_remove em_id 
     FROM irs_self_cert_em sc 
     WHERE  sc.date_cert_loc IS NULL 
      AND sc.date_first_cert_email_sent < '2014-10-03') 

SELECT * FROM em_ids 
+3

如果你改變 AS(SELECT TOP @num_to_remove em_id 到 AS(SELECT TOP(會發生什麼事@ num_to_remove)em_id – automatic 2014-10-02 21:04:18

+0

爲什麼你會接受一個不可能工作的答案(並且哪個方法不是解決這個問題的正確方法)? – 2014-10-03 14:16:02

回答

2

試試這個(注:我沒有測試它你可以試試這個類似)。

DECLARE @num_to_remove INT 
SET @num_to_remove = 2 

-- get em_ids for records to delete 
EXEC 
(
    'WITH em_ids 
    AS (SELECT TOP ' + CAST(@num_to_remove AS varchar(10) + 'em_id 
     FROM irs_self_cert_em sc 
     WHERE  sc.date_cert_loc IS NULL 
      AND sc.date_first_cert_email_sent < ''2014-10-03'') 
    ' 
) 
+2

您不需要動態SQL。至少有兩個原因:(1)不能像'EXEC()'內部那樣創建表達式,(2)這將最終成爲'SELECT TOP 2em_id' (注意'2'和'em_id'之間沒有空格)。 – 2014-10-02 21:15:48

3

在常規TSQL,你只能使用變量來表示值,而不是列名或其他物體。我知道「TOP」子句的數值看起來應該是合格的,但它沒有。

要以這種方式使用變量,您必須執行Dynamic SQL

+6

嗯,這對我來說工作正常。'DECLARE @t INT = 5; SELECT TOP(@t)* FROM sys.objects;' – 2014-10-02 21:13:59

+0

嗯,對我也適用,從來不知道,因爲你沒有提供這個答案,所以我會在這裏留下這個爲未來用戶。 – 2014-10-03 12:51:31

相關問題