我正在开发一个存储过程,其中需要从代码发送
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 列的用户定义表类型:
我会将其传递到我的 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
、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)
这听起来很简单,根据您的编辑,有一个您想要搜索的 varchar(MAX) 列。 我们称之为 col1
CREATE PROCEDURE sp_test
@param1
AS
BEGIN
SELECT * FROM Table WHERE **col1** like @param1
END