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

Sql server 将WHERE子句作为参数传递到SQL Server存储过程中,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我正在处理一个存储过程,其中where子句中使用的一个参数需要从代码中发送。例如— CREATE PROCEDURE sp_test @param1 AS BEGIN SELECT * FROM Table WHERE @param1 END 在上面的存储过程中,传递给@param1的值类似于Col1,类似于“%abc%”和Col1,类似于“%xyz%”我知道这可以使用动态SQL来完成,但我不希望使用它 任何帮助都将不胜感激 编辑 我有一个varchar(

我正在处理一个存储过程,其中
where
子句中使用的一个参数需要从代码中发送。例如—

CREATE PROCEDURE sp_test
    @param1 
AS
BEGIN
    SELECT * 
    FROM Table 
    WHERE @param1
END
在上面的存储过程中,传递给
@param1
的值类似于
Col1,类似于“%abc%”和Col1,类似于“%xyz%”
我知道这可以使用动态SQL来完成,但我不希望使用它

任何帮助都将不胜感激

编辑


我有一个
varchar(MAX)
列,我希望根据用户输入的值搜索此列。使用的操作员(和/或)由用户在前端选择。这是问题的内联部分

我将创建一个包含3列的用户定义表类型:
-匹配类型(相等、相似等)
-搜索值
-和/或

我将把它传递到我的SP中,然后使用动态SQL构建查询


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

如评论中所述,通常没有好的理由传递完整的子句: -您正在删除数据库层的抽象(如果需要切换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
column2 value
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)

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

创建程序sp_测试 @参数1 作为 开始 从表中选择*,其中col1类似@param1
结束

如果必须这样做,那么动态SQL是您唯一的选择。然而,这不是一个好办法——让你容易注射,会损害你的表现。这是个糟糕的主意。您正在两层之间创建隐式链接,这只会使您的体系结构复杂化。这是我不想使用动态SQL的主要原因之一。还有其他选择吗?为了找到更好的方法,您需要更详细地解释您正试图完成的任务。旁注:您不应该在存储过程中使用
sp_u
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!我曾想过使用用户定义的表类型,但用户输入的查询类似于(a或B)和(C或D)。此筛选器需要应用于列。使用表类型,生成这种动态SQL是很困难的。此外,这是唯一需要动态SQL的字段。我将50个其他参数传递给该过程,将所有参数转换为动态SQL非常困难。您可以将现有搜索查询转换为临时表,然后使用动态SQL进行最终筛选。无论哪种方式,它都将是动态SQL,这就是您将细节传递到SP的方式—我不想传递SQL片段。明白了。这是不可行的,因为我们有多个列值要被检查。在没有动态查询的情况下,实现是可能的,但是你需要仔细考虑后果。如果您有一个名为col1的varchar(max)列,并且该列有该行数据的一个字符串副本,则可以将搜索条件简化为“where col1 like@param”。这避免了动态查询,但暴露了其他问题。如果其他字段的大小是固定的,则将它们相加并使用该字段而不是最大值。您可以使用触发器更新col1,也可以使用XML行。将在5000行以下工作。否则,请使用sp_executesql如果您看到链接的问题,您就会明白这种方法是行不通的。