在动态SQL语句中使用与通配符类似的问题

时间:2018-01-05 12:48:04

标签: sql sql-server dynamic-sql sql-like

我试图在存储过程中使用动态SQL语句来根据用户的输入过滤查询。我只使用一个需要在数据库中找到匹配的forenames的参数开始基本。

CREATE PROCEDURE dbo.uspFilter
    @FirstName varchar(100) = null,
    @Debug bit = 1
AS

DECLARE @SQL nvarchar(max);
DECLARE @Params nvarchar(max);
DECLARE @Search nvarchar(300);

SELECT @Params = N'@FirstName varchar(300) = null'
SELECT @SQL = N'SELECT * FROM Table WHERE 1=1'

IF @FirstName IS NOT NULL
    SELECT @Search = N'@FirstName' + N'%'''
    SELECT @SQL = @SQL + N' AND Forename LIKE ''' + @Search

IF @Debug = 1
    @PRINT @SQL

EXEC sp_executeSQL @SQL, @Params, @FirstName = @FirstName;
GO

EXEC dbo.uspFilter @FirstName = 'Test', @Debug = 1;
GO

debug语句的输出看起来正确,但它没有返回任何结果:

SELECT * FROM Table WHERE 1=1 AND Forename LIKE '@FirstName%'

编辑:这是我正在寻找的精简版 - 我将使用不同搜索条件的多个参数。

2 个答案:

答案 0 :(得分:1)

您需要这样做:

driver.find_elements_by_xpath("//table/tr/td[2]")

请注意,尽管Crowcoder对SQL注入的评论很重要,但您可以编写不允许注入的动态SQL。如上。

编辑:一些轻微的修正。

答案 1 :(得分:0)

您也可以在不进行动态查询的情况下应用动态where条件,请看下面的示例示例。您可以通过以下示例应用AND where子句来加入其他过滤器。

Declare @firstName VARCHAR(50)='sa'

SELECT
    *
FROM Table 
WHERE 
(
    (Forename LIKE '%'+@firstName+'%' AND @firstName!='') 
    OR 
    (@firstName='')
)