何处的SQL Server动态条件
假设我有两张桌子: 学生:身份证、姓名、年龄、班级等 条件:Id,条件 列Conditions.Condition包含一个SQL条件,例如std.Age>2或std.Class=3 我想要一个能做到以下几点的东西:何处的SQL Server动态条件,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,假设我有两张桌子: 学生:身份证、姓名、年龄、班级等 条件:Id,条件 列Conditions.Condition包含一个SQL条件,例如std.Age>2或std.Class=3 我想要一个能做到以下几点的东西: SELECT std.Id as StudentId, con.Id as ConId FROM Students as std, Condition as con WHERE con.Condition 可能是一个接受学生Id的函数 我如何做到这一点 学生:
SELECT std.Id as StudentId, con.Id as ConId
FROM Students as std,
Condition as con
WHERE con.Condition
可能是一个接受学生Id的函数
我如何做到这一点
学生:
1 , Yossi, 25, 3..
2 , David, 22, 3..
3 , Jhon, 5, 2..
4 , Smith, 25, 4..
条件:
1 , Age > 3
2 , Class = 4
3 , Name LIKE '%i%'
结果将是条件,Studnet:
(1,1) (1,2) (1,3) (1,4) // all are older than 3
(2,4) // only Smith is in class 4
(3,1) (3,2) (3,4) // all except jhon have an i in their name
尝试以下查询:
DECLARE @CONDITIONS varchar(max) =
REPLACE(REPLACE((
SELECT'UNION ALL SELECT ID AS STUDENTID , ' + CONVERT(VARCHAR , ID ) + ' AS CONDITIONID FROM STUDENTS WHERE ' + CONDITION + ' '
FROM CONDITION
FOR XML PATH('')
) , '<' , '<') , '>' , '>')
SET @CONDITIONS = (SELECT SUBSTRING(@CONDITIONS , 11 , LEN(@CONDITIONS)))
EXEC(@CONDITIONS)
这是应用条件的更一般化的方法。如果您只想应用一个条件,那么在查询中添加where子句,从中获取所有条件。您可以针对一个或多个条件运行此查询。目前我已经编写了这个应用所有条件的查询
您必须构建一个包含条件的字符串,然后执行它。这就是所谓的动态SQL 例如:
DECLARE @sql Varchar(400)
SELECT @sql = 'SELECT * FROM MyTable WHERE ' + condition
FROM Conditions
WHERE cond_key = 1
-- This will yield you a full SQL statement, if the condition record
-- is there.
EXECUTE(@sql) -- And this will execute it
条件表中有多少个条件?不要太多。。。但是我希望它们是动态的,你希望像sql这样的东西,quere会在执行时检查所有的条件,对吗?你能把一些数据放在这里,这样我就可以得到batter了吗idea@HirenDhaduk编辑question@AK_你核对我的答案了吗?这就是你想要的吗?告诉我你是否需要进一步的定制,或者这个查询是否完美?我现在正在评估你的答案,以了解我的真实用例。。。我可能会用一些稍微不同的东西。。。但这是一个很好的解决方案…谢谢,我总是试图找到最好的解决方案。事实上,我正在使用NHibernate访问数据库。我最初的方向是可能使用“联接”,但如果唯一的解决方案是对条件的所有采石场进行“并集”,那么我将单独创建它们,并使用多查询或其他方法运行它们。这一方法仅用于返回一行。请求是针对多行的,但事实并非如此:它将执行构造的SQL语句,并返回该语句将返回的任何内容。这个例子只是为了说明如何使用动态SQL。很抱歉,HirenDhaduk的一个结论是,他要求学生和他们回答的条件进行配对。您创建动态SQL的where子句将其约束为一个条件。我是在响应OP,而不是其他人的评论。这是我要朝的方向,但我在使用查询语句时遇到了问题。。。