2013-07-23 91 views
-2

我想SELECT從SQL Server 2008的一個特定的記錄,這是我使用如何在查詢結尾添加變量?

ALTER PROCEDURE [dbo].[usp_GetTotalSalesReport] 
    (@FROM_DATE nchar(20), 
    @TO_DATE nchar(20), 
    @SALESMANCODE nchar(8) 
    ) 
AS 
BEGIN 
    DECLARE @CONDITION TEXT 

    IF (@FROM_DATE IS NULL AND @TO_DATE IS NULL AND @SALESMANCODE = 'ALL') BEGIN 
    SET @CONDITION = NULL  
    END 
    IF (@FROM_DATE IS NULL AND @TO_DATE IS NULL AND @SALESMANCODE != 'ALL') BEGIN 
    SET @CONDITION = ' WHERE SalesManCode= @SALESMANCODE' 
    END 
    IF @FROM_DATE IS NOT NULL AND @SALESMANCODE = 'ALL' BEGIN 
    SET @CONDITION = ' WHERE TransactionDateTime >= @FROM_DATE AND TransactionDateTime <= @TO_DATE' 
    END 
    IF @FROM_DATE IS NOT NULL AND @SALESMANCODE != 'ALL' BEGIN 
    SET @CONDITION = ' WHERE TransactionDateTime >= @FROM_DATE AND TransactionDateTime <= @TO_DATE AND SalesManCode = @SALESMANCODE' 
    END 
    IF @FROM_DATE IS NOT NULL AND @TO_DATE IS NOT NULL AND @SALESMANCODE = 'ALL' BEGIN 
    SET @CONDITION = ' WHERE TransactionDateTime >= @FROM_DATE AND TransactionDateTime <= @TO_DATE' 
    END 
    IF @FROM_DATE IS NOT NULL AND @TO_DATE IS NOT NULL AND @SALESMANCODE != 'ALL' BEGIN 
    SET @CONDITION =' WHERE TransactionDateTime >= @FROM_DATE AND TransactionDateTime <= @TO_DATE AND SalesManCode = @SALESMANCODE' 
    END 
    SELECT RouteName 
     ,SalesManCode 
     ,SalesManName 
     ,CustomerCode 
     ,CustomerNameEng 
     ,TransactionDateTime 
     ,DocumentPrefix 
     ,DocumentNumber 
     ,BalanceDueAmount 
     ,RouteID 
     ,PaymentType FROM v_DCS_Rpt_Total_Sales @CONDITION 
    END 

代碼如果我嘗試在查詢的末尾添加@CONDITION變量像

PaymentType FROM v_DCS_Rpt_Total_Sales @CONDITION 

我收到此錯誤

附近有語法錯誤@CONDITION「

我迄今爲止嘗試是:

PaymentType FROM v_DCS_Rpt_Total_Sales +" "+ @CONDITION` 

但它給我這個錯誤

附近有語法錯誤 '+'。

+1

只是說明理由那些誰給下投票 – Rakesh

+1

條件是文本,因此請使用nvarchar(MAX)。文字已棄用 –

+1

@Vijesh糟糕的代碼,糟糕的命名約定,沒有太多的指令手冊閱讀,只有列前的逗號是好的代碼。 – Tomasito

回答

3

爲您的代碼的工作,因爲它是你需要動態SQL:

DECLARE @Query NVARCHAR(MAX) 
SET @Query = 'SELECT RouteName 
     ,SalesManCode 
     ,SalesManName 
     ,CustomerCode 
     ,CustomerNameEng 
     ,TransactionDateTime 
     ,DocumentPrefix 
     ,DocumentNumber 
     ,BalanceDueAmount 
     ,RouteID 
     ,PaymentType FROM v_DCS_Rpt_Total_Sales '[email protected] 
EXEC(@SQL) 

現在,你真的不需要在這裏使用動態SQL,你可以不直接使用所有這那些IF S:

SELECT RouteName 
     ,SalesManCode 
     ,SalesManName 
     ,CustomerCode 
     ,CustomerNameEng 
     ,TransactionDateTime 
     ,DocumentPrefix 
     ,DocumentNumber 
     ,BalanceDueAmount 
     ,RouteID 
     ,PaymentType 
FROM v_DCS_Rpt_Total_Sales 
WHERE (@SALESMANCODE = 'ALL' OR SalesManCode = @SALESMANCODE) 
AND (@FROM_DATE IS NULL OR TransactionDateTime >= @FROM_DATE) 
AND (@TO_DATE IS NULL OR TransactionDateTime <= @TO_DATE) 
+0

這是很好的兄弟...非常感謝.. – Rakesh

0

您可以使用動態SQL與EXECUTE語句或sp_executesql的執行字符串命令。整個命令需要是一個字符串;在你的情況下,你只是試圖將一個字符串添加到正常命令的末尾,這不起作用。

下面是一個例子...

DECLARE @someBool; 
SET @someBool = true; 
DECLARE @query VARCHAR(MAX); 
SET @query = 'SELECT * FROM table1'; 
SET @condition1 = ' WHERE column1 = 1'; 
SET @condition2 = ' WHERE column2 = 2'; 

IF(@someBool) 
    SET @query = @query + @condition1; 
ELSE 
    SET @query = @query + @condition2; 

EXECUTE(@query); 

這個例子,雖然簡陋,展示瞭如何構建一個命令串,並使用EXECUTE執行它。您也可以只使用sp_executesql。

有關EXECUTE和sp_executesql之間區別的更多詳細信息,請參閱此文章。

Dynamic SQL - EXEC(@SQL) versus EXEC SP_EXECUTESQL(@SQL)

0

在一個簡單的情況下,像這樣不需要動態SQL的..

SELECT RouteName 
     ,SalesManCode 
     ,SalesManName 
     ,CustomerCode 
     ,CustomerNameEng 
     ,TransactionDateTime 
     ,DocumentPrefix 
     ,DocumentNumber 
     ,BalanceDueAmount 
     ,RouteID 
     ,PaymentType 
FROM v_DCS_Rpt_Total_Sales 
WHERE SalesManCode = CASE WHEN @SALESMANCODE = 'ALL' THEN SalesManCode ELSE @SALESMANCODE AND 
     TransactionDateTime >= ISNULL(@FROM_DATE,TransactionDateTime) AND 
     TransactionDateTime <= ISNULL(@TO_DATE,TransactionDateTime)