我正在处理一个存储过程,其中需要从代码发送WHERE
子句中使用的参数之一。对于前-
CREATE PROCEDURE sp_test
@param1
AS
BEGIN
SELECT *
FROM Table
WHERE @param1
END
在上面的存储过程中,传递给@param1
的值将类似于Col1 LIKE '%abc%' AND col1 LIKE '%xyz%'
,我知道可以使用动态SQL来完成,但是我不希望使用它。
任何帮助将不胜感激。
编辑
我有一个varchar(MAX)
列,我正在根据用户输入的值搜索此列。用户在前端选择使用的运算符(AND / OR)。这与here
答案 0 :(得分:1)
我将创建一个具有3列的用户定义表类型:
-匹配类型(等于等)
-搜索值
-和/或
我会将其传递到我的SP中,然后使用动态SQL来构建查询。
在允许用户定义搜索条件时,您实际上没有太多其他选择。但是我绝对会以结构化格式通过搜索条件,以便您最终控制最终的SQL(与在其中插入预先形成的SQL的应用相反)。
答案 1 :(得分:0)
正如评论中提到的,通常从来没有理由传递一个完整的子句: -您正在删除数据库层的抽象(如果您需要切换DBMS,则需要更改where子句的语法,并假设它有所不同)。 -您可能会接受注入式攻击。
更好地了解您的需求,并相应地对存储过程进行参数化。 例如, 您需要以下查询:
<%
import statistics, numpy
medianStockReturn = []
def stockReturn():
global medianStockReturn
yearStockReturn = numpy.random.normal(11.4, 19.7, 1000)
yearMedianStockReturn = statistics.median(yearStockReturn)
yearMedianStockReturn = yearMedianStockReturn / 100 + 1
medianStockReturn.append(yearMedianStockReturn)
end
stockReturn()
%>
<!DOCTYPE html>
<html lang = "en-us">
<head>
<title>Retirement Calculator</title>
<meta charset = "utf-8">
<link rel="stylesheet" type="text/css" href="../static/retirementStyle.css">
</head>
<body>
<h2> this is a test; your stock return is {{medianStockReturn}}</h2>
</body>
</html>
传递3个参数select * from TABLE where column1 like '%XX%' and column2 like '%YY%'
select * from TABLE where column1 like '%XX%' or column2 like '%YY%'`
,column1Value
,column2Value
然后使用条件语句执行不同的查询:
clauseConnector
您还可以使用动态sql在一条语句中构建查询。
IF @clauseConnector = 'AND'
BEGIN
select * from TABLE where c1 like '%' + @column1Value + '%' AND c2 like '%' + @column2Value + '%'
END
ELSE
BEGIN
select * from TABLE where c1 like '%' + @column1Value + '%' OR c2 like '%' + @column2Value + '%'
END
答案 2 :(得分:-1)
这听起来很简单,根据您的编辑,有一个要搜索的varchar(MAX)列。我们称它为col1
创建过程sp_test @ param1 如 开始 SELECT * FROM Table WHERE col1 如@ param1 结束