Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用另一个表中的值的动态SQL where条件_Sql_Sql Server_Tsql_Stored Procedures_Dynamic Sql - Fatal编程技术网

使用另一个表中的值的动态SQL where条件

使用另一个表中的值的动态SQL where条件,sql,sql-server,tsql,stored-procedures,dynamic-sql,Sql,Sql Server,Tsql,Stored Procedures,Dynamic Sql,我想构建一个动态SQL查询,在这里我可以使用另一个表中的数据作为where条件。假设我有两个表:一个是财务数据表,另一个是条件表。它们看起来像这样: 餐桌销售 以及包含以下数据的条件表: dimension operator wert_db --------- -------- ------- sales.c006 < 700 sales.c048 not like 'MIC%' sales.c0

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

餐桌销售

以及包含以下数据的条件表:

   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)

既然你没有发表过自己试图解决或研究这个问题的文章,我将为你指出一个方向,让你开始

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

您可以使用该技术将条件行组合到WHERE子句中


对链接示例的一个更改是,您需要将维度、运算符和wert_db连接到最内层SELECT中的一个人工列中。此外,您将使用“AND”分隔,而不是使用逗号分隔。并更改STUFF函数的参数,以去掉“And”的长度,而不是逗号的长度。

既然您自己没有尝试解决或研究这个问题,我将为您指出一个开始的方向

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.
您的问题已经提到使用动态SQL,所以我假设您至少知道这是什么。您将填充一个字符串变量,以“SELECT*FROM Sales”开头

您可以使用该技术将条件行组合到WHERE子句中


对链接示例的一个更改是,您需要将维度、运算符和wert_db连接到最内层SELECT中的一个人工列中。此外,您将使用“AND”分隔,而不是使用逗号分隔。并更改STUFF函数的参数,以去掉“And”的长度,而不是逗号的长度。

您需要一个大大小写表达式或动态SQL。在列中存储SQL代码通常不被认为是一种好的做法,除非你有很好的理由。是的,你是对的,这不是一种好的做法,但我们的客户提供了一个excel表格,其中包含的条件被直接传输到表中……你要么需要一个大规模的case表达式,要么需要动态SQL。在列中存储SQL代码通常不被认为是一种好的做法,除非你有很好的理由。是的,你是对的,这不是一种好的做法,但我们的客户提供了一个excel表,其中包含直接转换到表中的条件。。。
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.