-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` 

但它给了我这个错误

'+' 附近的语法不正确。

4

3 回答 3

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 '+@CONDITION
EXEC(@SQL)

现在,您真的不需要在这里使用动态 SQL,您可以直接使用它而无需所有这些IF

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)
于 2013-07-23T15:07:01.943 回答
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)
于 2013-07-23T15:12:06.770 回答
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 之间区别的更多详细信息,请参阅这篇文章。

动态 SQL - EXEC(@SQL) 与 EXEC SP_EXECUTESQL(@SQL)

于 2013-07-23T15:08:17.680 回答