如何在LIKE语句中使用参数,以及动态执行SQL语句

2024-12-04 07:32:41
推荐回答(1个)
回答1:

拼SQL的方法不好,因为有安全的风险,容易造成SQL的语法错误甚至SQL注入攻击。安全的方法是将'%'加入到参数中:

--查询图书表中与查询关键字匹配的书籍信息
ALTER PROCEDURE [dbo].[SP_SelectByKeywordProc]
(
@Keyword varchar(40)
)
AS
BEGIN
DECLARE @SqlString nvarchar(400);
SET @SqlString = N'SELECT * FROM BOOK WHERE BOOK_NAME LIKE @Key_word ';
SET @KeyWord = N'%' + Keyword + '%';

EXEC SP_EXECUTESQL @SqlString, N'@Key_word varchar(40)', @Key_word= @KeyWord;
RETURN(0);
END

这里还要注意带参数的SP_EXECUTESQL系统存储过程的使用方法:
1、前两句为字符串,其中第一句为执行的SQL语句;第二句为语句中参数的定义,如果有多个变量则用逗号分隔;
2、后面的子句为赋值语句,可以有多个;
3、执行的动态SQL语句应当为ntext/nchar/nvarchar型,否则会报错:“Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.”

MSDN上的例子:
DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @max_title varchar(30);

SET @IntVariable = 197;
SET @SQLString = N'SELECT @max_titleOUT = max(Title)
FROM AdventureWorks.HumanResources.Employee
WHERE ManagerID = @level';
SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;