将WHERE子句作为参数传递到SQL Server存储过程

时间:2018-12-04 01:14:57

标签: sql-server sql-server-2012

我正在处理一个存储过程,其中需要从代码发送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

提出的问题一致

3 个答案:

答案 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%'` column1Valuecolumn2Value

然后使用条件语句执行不同的查询:

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 结束