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

问题描述 投票:0回答:3

我正在开发一个存储过程,其中需要从代码发送

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

提出的问题一致
sql-server sql-server-2012
3个回答
1
投票

我将创建一个包含 3 列的用户定义表类型:

  • 匹配类型(等于、类似等)
  • 搜索值
  • 和/或

我会将其传递到我的 SP,然后使用动态 SQL 构建查询。

当允许用户定义搜索条件时,您实际上没有很多其他选项。但我肯定会以结构化格式传递搜索条件,以便您对最终 SQL 拥有最终控制权(而不是应用程序插入预先形成的 SQL)。


0
投票

正如评论中提到的,通常没有充分的理由传递完整的子句: - 您正在删除数据库层的抽象(如果您需要切换 DBMS,则需要更改 where 子句语法,假设它不同)。 - 您可能会面临注射攻击。

更好地理解您的需求并相应地参数化您的存储过程。 例如, 您可能需要以下查询:

select * from TABLE where column1 like '%XX%' and column2 like '%YY%'
select * from TABLE where column1 like '%XX%' or column2 like '%YY%'`

传递3个参数

column1Value
column2Value
clauseConnector

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

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

您还可以使用动态 SQL 在一条语句中构建查询。

SET @query = 'SELECT * FROM TABLE WHERE ' + 
'Column1 like ''%' + column1Value  + '%'' '
+ @clauseConnector  + ' ' +
IIF (@column2Value IS NOT NULL,'Column2 like ''%' + column2Value  + '%'''
EXECUTE(@SQLQuery)

-1
投票

这听起来很简单,根据您的编辑,有一个您想要搜索的 varchar(MAX) 列。 我们称之为 col1

CREATE PROCEDURE sp_test
@param1
AS
BEGIN
    SELECT * FROM Table WHERE **col1** like @param1
END
© www.soinside.com 2019 - 2024. All rights reserved.