【问题标题】:Dynamic SQL where condition with values from another table动态 SQL where 条件与来自另一个表的值
【发布时间】:2019-08-06 15:58:48
【问题描述】:

我想构建一个动态 SQL 查询,我可以在其中使用另一个表中的数据作为 where 条件。假设我有两张表:一张包含财务数据,另一张包含条件。它们看起来像这样:

sales

c006    mesocomp    c048      c020   c021
-----  ---------- -------    -----   ----
120     01TA       MICROSOFT  2      239

还有一个condition 表,其中包含以下数据:

   dimension   operator    wert_db 
   ---------   --------    ------- 
   sales.c006     <           700 
   sales.c048   not like    'MIC%'
   sales.c021   in         (203,206)   

我想从符合条件表中所述条件的销售中选择所有数据。所以我有一个 SQL 查询如下:

SELECT * 
FROM sales 
WHERE sales.c006 < 700 
  AND sales.c048 NOT LIKE 'MIC%' 
  AND sales.c021 IN (203, 206)

【问题讨论】:

  • 您要么需要大量的case 表达式,要么需要动态 SQL。将 SQL 代码存储在列中通常不被认为是一种好的做法,除非您有充分的理由。
  • 是的,你说得对,这不是一个好的做法,但我们的客户提供了一个包含直接传输到表格中的条件的 Excel 表...

标签: sql sql-server tsql stored-procedures dynamic-sql


【解决方案1】:

由于您没有尝试自己解决或研究此问题,因此我会为您指明一个开始的方向。

您的问题已经提到使用动态 SQL,所以我假设您至少知道那是什么。您将填充一个字符串变量,以 'SELECT * FROM Sales ' 开头。

您可以使用STUFF...FOR XML PATH 技术将conditions 行组合成一个WHERE 子句。

对链接示例的一个更改是您需要将dimensionoperatorwert_db 连接到最里面的SELECT 中的一个人工列中。此外,您将使用' AND ' 分隔,而不是用逗号分隔。并修改STUFF函数的参数,去掉' AND '的长度,而不是逗号的长度。

【讨论】:

    【解决方案2】:
    DECLARE @tblSales TABLE
    (
        c006     VARCHAR(10),
        mesocomp VARCHAR(100),
        c048     VARCHAR(100),
        c020     VARCHAR(100),
        c021     VARCHAR(100)
    )
    
    INSERT INTO @tblSales(c006, mesocomp, c048, c020, c021)
    VALUES(120,'01Ta','Microsoft','2','239')
    
    SELECT * FROM @tblSales
    
    DECLARE @tblCondition TABLE
    (
        Id INT,
        dimension VARCHAR(100),
        operator  VARCHAR(10),
        wert_db   VARCHAR(100)
    )
    
    INSERT INTO @tblCondition(Id, dimension, operator, wert_db) VALUES(1,'sales.c006','<','700')
    INSERT INTO @tblCondition(Id, dimension, operator, wert_db) VALUES(1,'sales.c048','not like','''MIC%''')
    INSERT INTO @tblCondition(Id, dimension, operator, wert_db) VALUES(1,'sales.c021','in','(203,206)')
    
    DECLARE @whereCondition VARCHAR(400)    
    SELECT @whereCondition = COALESCE(@whereCondition + ' ', '') + dimension + ' ' + operator + ' ' + wert_db + ' AND '
    FROM @tblCondition
    SET @whereCondition = SUBSTRING(@whereCondition,0, LEN(@whereCondition) - 3) 
    
    PRINT @whereCondition
    
    DECLARE @sql VARCHAR(4000)
    SET @sql = 'SELECT * FROM @tblSales Where ' + @whereCondition
    
    PRINT @sql
    EXEC(@sql)
    --please use real tables so you will get everything working.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2021-12-11
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多